时区与日历

时间:2016-03-07 17:36:41

标签: java date calendar simpledateformat

在使用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");

我得到预期的“2012年3月4日星期日18:00 CST”,这是在UTC之前6小时,即UTC-6:00。

为什么我的结果有误?

1 个答案:

答案 0 :(得分:1)

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

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

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