我有这段代码:
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
。输出为:
周日3月27日03:48:00 CEST
我期望:
2016年3月27日,星期日2:48:00
首先,我认为这是一个
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开始改变。出于实际原因(实际上是睡眠质量),时间切换是在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());
输出:
2016年3月28日星期一02:48:00