Calendar.HOUR_OF_DAY 混乱
Calendar.HOUR_OF_DAY confusion
我有这段代码:
Calendar cal = Calendar.getInstance();
cal.setTime(pDatum);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2)));
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4)));
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime());
其中 pDatum
是 Sun Mar 27 00:00:00 CET 2016
,pHHMMTP
是 02485
,pHHMMTP.substring(0, 2)
是 02
。
输出为:
Sun Mar 27 03:48:00 CEST 2016
我预计:
Sun Mar 27 02:48:00 CEST 2016
起初我认为这是一个 TimeZone
问题,但使用这段代码我得到了相同的输出:
Calendar cal = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("GMT");
cal.setTimeZone(tz);
cal.setTime(pDatum);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2)));
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4)));
cal.set(Calendar.MILLISECOND, 0);
你看到我的问题了吗?
CET 表示欧洲中部时区。在欧洲,有一个概念Daylight Saving Time。
基本上,在冬天,小时从 1h 偏移。出于实际原因(实际上是睡眠质量),时间切换在 spring 的第一个星期日完成,即 2016 年 3 月 27 日。此外,出于实际原因,时间切换在夜间进行,介于02:00 AM 和 03:00 AM,所以时钟倒计时是这样的:01:58
、01:59
、03:00
、03:01
。这意味着,Sun Mar 27 02:48:00 CET 2016
不存在。
因此,如果你 运行 你的代码在 Sun Mar 27
,你会得到 03:48
但如果你 运行 它在 Mon Mar 28
,你会得到 02:48
.
尝试两个日期:
//Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("27/03/2016 CET");
Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("28/03/2016 CET");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 48);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime());
输出:
Mon Mar 28 02:48:00 CEST 2016
这是时区问题,您在 GMT 中构建日历,但在 CEST 时区中打印日期。
编辑:
当日期打印出来时区相同,就可以了:
Calendar cal = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("GMT");
cal.setTimeZone(tz);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 48);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime()); // <-- System default Zone
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
formatter.setTimeZone(tz);
System.out.print(formatter.format(cal.getTime())); // <-- Same TimeZone
输出:
Tue Mar 22 03:48:06 CET 2016
Tue Mar 22 02:48:06 GMT 2016
我有这段代码:
Calendar cal = Calendar.getInstance();
cal.setTime(pDatum);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2)));
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4)));
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime());
其中 pDatum
是 Sun Mar 27 00:00:00 CET 2016
,pHHMMTP
是 02485
,pHHMMTP.substring(0, 2)
是 02
。
输出为:
Sun Mar 27 03:48:00 CEST 2016
我预计:
Sun Mar 27 02:48:00 CEST 2016
起初我认为这是一个 TimeZone
问题,但使用这段代码我得到了相同的输出:
Calendar cal = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("GMT");
cal.setTimeZone(tz);
cal.setTime(pDatum);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2)));
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4)));
cal.set(Calendar.MILLISECOND, 0);
你看到我的问题了吗?
CET 表示欧洲中部时区。在欧洲,有一个概念Daylight Saving Time。
基本上,在冬天,小时从 1h 偏移。出于实际原因(实际上是睡眠质量),时间切换在 spring 的第一个星期日完成,即 2016 年 3 月 27 日。此外,出于实际原因,时间切换在夜间进行,介于02:00 AM 和 03:00 AM,所以时钟倒计时是这样的:01:58
、01:59
、03:00
、03:01
。这意味着,Sun Mar 27 02:48:00 CET 2016
不存在。
因此,如果你 运行 你的代码在 Sun Mar 27
,你会得到 03:48
但如果你 运行 它在 Mon Mar 28
,你会得到 02:48
.
尝试两个日期:
//Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("27/03/2016 CET");
Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("28/03/2016 CET");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 48);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime());
输出:
Mon Mar 28 02:48:00 CEST 2016
这是时区问题,您在 GMT 中构建日历,但在 CEST 时区中打印日期。
编辑:
当日期打印出来时区相同,就可以了:
Calendar cal = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("GMT");
cal.setTimeZone(tz);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 48);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime()); // <-- System default Zone
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
formatter.setTimeZone(tz);
System.out.print(formatter.format(cal.getTime())); // <-- Same TimeZone
输出:
Tue Mar 22 03:48:06 CET 2016
Tue Mar 22 02:48:06 GMT 2016