首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Calendar.HOUR_OF_DAY混淆

Calendar.HOUR_OF_DAY混淆
EN

Stack Overflow用户
提问于 2016-03-22 13:38:12
回答 2查看 5.7K关注 0票数 1

我有一段代码:

代码语言:javascript
复制
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

产出如下:

2016年美国东部时间3月27日03:48:00

我希望:

2016年美国东部时间3月27日02:48:00

首先,我认为这是一个TimeZone问题,但是使用这段代码我得到了相同的输出:

代码语言:javascript
复制
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);

你看到我的问题了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-22 14:03:22

CET是指中欧时区。在欧洲,有一个关于夏令时的概念。

基本上,在冬天,时间从1小时开始转换。出于实际原因(实际上是睡眠质量),时间转换是在2016年3月27日的春天的第一个星期日进行的。另外,出于实际原因,时间转换是在夜间,从凌晨02:00到凌晨3:00,所以时钟按如下方式计算:01:5801:5903:0003:01。这意味着,Sun Mar 27 02:48:00 CET 2016 不存在

因此,如果您在Sun Mar 27上运行您的代码,您将得到03:48,但是如果您在Mon Mar 28上运行它,您将得到02:48

试着用这两个日期:

代码语言:javascript
复制
//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());

产出:

星期一3月28日02:48: 2016中欧时间

票数 2
EN

Stack Overflow用户

发布于 2016-03-22 14:15:09

这是一个TimeZone问题,您正在GMT中构建日历,但在CEST区域中打印日期。

编辑:

当日期用相同的时区打印出来时,就可以了:

代码语言:javascript
复制
  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

输出:

代码语言:javascript
复制
Tue Mar 22 03:48:06 CET 2016
Tue Mar 22 02:48:06 GMT 2016
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36155927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档