从EDT到EST的Java时区过渡期

从EDT到EST的Java时区过渡期,java,timezone,dst,Java,Timezone,Dst,问题陈述:将“2014-11-02 01:00:15 EST”转换为GMT 这似乎很容易。但为什么下面的代码给出了错误的答案 背景: EDT又名GMT-4 EST又名GMT-5 2014-11-02 01:00:15美国东部时间==2014-11-02 06:00:15格林尼治标准时间 如果我使用了注释掉的日期字符串,它会工作 美国东部夏令时(截止2014年11月2日凌晨2点)->凌晨2点我们去东部夏令时凌晨1点 代码示例: ZoneId gmt = ZoneId.of("GMT"); //

问题陈述:将“2014-11-02 01:00:15 EST”转换为GMT

这似乎很容易。但为什么下面的代码给出了错误的答案

背景:

  • EDT又名GMT-4
  • EST又名GMT-5
  • 2014-11-02 01:00:15美国东部时间==2014-11-02 06:00:15格林尼治标准时间
  • 如果我使用了注释掉的日期字符串,它会工作
  • 美国东部夏令时(截止2014年11月2日凌晨2点)->凌晨2点我们去东部夏令时凌晨1点
代码示例:

ZoneId gmt = ZoneId.of("GMT");
//String from = "2014-11-02 01:00:15 GMT-05:00";
String from = "2014-11-02 01:00:15 EST";

final DateTimeFormatter dateTimeFormatterone = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZnedDateTime zonedDateTime = ZonedDateTime.parse(from, dateTimeFormatterone);
ZonedDateTime gmtzonedDateTime = zonedDateTime.withZoneSameInstant(gmt);
String result = gmtzonedDateTime.format(dateTimeFormatterone);
这就是结果

result == "2014-11-02 05:00:15 GMT"
难道不是吗 结果==“2014-11-02 06:00:15 GMT”

任何帮助都会很好。我认为这是Java中的一个bug。但我也认为我在某个地方犯了错误

谢谢
Paul

给定的GMT偏移缩写没有
。改变

String from = "2014-11-02 01:00:15 GMT-05:00";

还有一些逻辑错误:


如果你在2014年11月2日凌晨2点从2点改为1点,那么从6点改为5点是否也正确?而凌晨5点是否正确?

我相信你的做法是相反的。EDT是GMT-4,EST是GMT-5。这意味着输出(05:00:15 GMT)是正确的。你是对的。我更新了示例。如果你有机会,你可以看看我更新的例子。这是一个棘手的,也许是启发性的,因为人们总是可以指定一个时间作为EST,即使在EDT是活跃的。这意味着01:00:15(以及从凌晨1点到凌晨2点的整个小时)在美国东部标准时间的当晚连续出现两次。因此,当Java解析该日期时,解析器应该假设该时间的第一次出现,还是第二次出现?这就是“2014-11-02 01:00:15 GMT-05:00”返回正确的GMT值“2014-11-02 06:00:15 GMT”。此“美国东部时间2014-11-02 01:00:15”返回“2014-11-02 05:00:15 GMT”。不确定为什么会发生这种情况,因为“2014-11-02 01:00:15 GMT-05:00”和“2014-11-02 01:00:15 EST”应该相等。现在,如果您输入“2014-11-02 02:00:00 GMT-05:00”或“2014-11-02 02:00:00 EST”,您将得到“2014-11-02 07:00:00 GMT”的正确结果。就在那个窗口里,你们从美国东部夏令时凌晨2点移动到美国东部夏令时凌晨1点,我看到了这一点,但让我们假设我们没有DST。那么“2014-11-02 06:00:15”格林尼治标准时间是对的。现在,在11月2日凌晨1点,我们将时钟拨回1小时,而超过这个时间的所有小时都将减少1小时。因此:“2014-11-02 05:00:15 GMT”
String from = "2014-11-02 01:00:15 GMT-0500";