Calendar.HOUR_OF_DAY混乱

时间:2016-03-22 13:38:12

标签: java calendar timezone java.util.date

我有这段代码:

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());

其中pDatumSun Mar 27 00:00:00 CET 2016pHHMMTP02485pHHMMTP.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);

你看到我的问题吗?

2 个答案:

答案 0 :(得分:2)

CET表示中欧时区。在欧洲,有Daylight Saving Time的概念。

基本上,在冬天,小时从1小时开始。出于实际原因(实际上是睡眠质量),时间切换是在2016年3月27日的春天的第一个星期天完成的。另外,由于实际原因,时间切换在夜间,凌晨02:00之间完成。和03:00 AM,所以时钟倒计时如下:01:5801:5903:0003: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

答案 1 :(得分:1)

这是一个TimeZone问题,您在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