在使用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。
为什么我的结果有误?
答案 0 :(得分:1)
Calendar.HOUR
以12小时格式设置小时,因此您不会将其设置为午夜,而是设置为12点。
改为使用Calendar.HOUR_OF_DAY
或确保同时设置am / pm值:
cal.set(Calendar.AM_PM, Calendar.AM);