带日历的时区

Timezones with Calendar

我在使用 UTC 时区时遇到了 Calendar 和 SimpleDateFormatter 的一些意外行为。看起来 SimpleDateFormatter 给出了正确的结果,但 Calendar 却没有。我不确定为什么。我正在使用以下代码通过日历生成日期:

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.set(Calendar.YEAR, 2012);
    cal.set(Calendar.MONTH, Calendar.MARCH);
    cal.set(Calendar.DAY_OF_MONTH, 5);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);

换句话说,2012 年 3 月 5 日 00:00 UTC。
当我在本地 CST 时区打印这个时间时,我得到:

Mon Mar 05 06:00:00 CST 2012
这很奇怪,因为 CST 是 UTC-6:00,所以我期待 2012 年 3 月 4 日星期日 18:00 CST(即 6 小时前一天午夜之前)。相反,我在 UTC.

6 小时

当我像这样使用 SimpleDateFormatter 时:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    df.parse("2012-03-05");

我得到预期的 "Sunday March 4th, 2012 18:00 CST",即 UTC6 小时,即 UTC-6:00。

为什么我的结果是错误的?

Calendar.HOUR 将小时设置为 12 小时格式,因此您不是将其设置为午夜而是中午 12 点。

改用 Calendar.HOUR_OF_DAY 或确保同时设置 am/pm 值:

cal.set(Calendar.AM_PM, Calendar.AM);