当UTC为+时,Java获得UTC + 2

时间:2016-11-02 14:23:15

标签: java date timezone

最后一个星期天我们改变了中欧的时间(-1h)。但我正在进行一些测试,并且java时间解析器出了问题。这是代码

UTC: 2016-10-09 12:50:00
Lisboa: 2016-10-09 12:50:00
Madrid: 2016-10-09 14:50:00
Paris: 2016-10-09 14:50:00

这是输出

StoppableThread

为什么UTC和马德里时间的差异是2小时?现在在马德里是UTC + 1。

感谢。

2 个答案:

答案 0 :(得分:4)

时间是正确的,因为时钟在10月30日凌晨2点发生了变化

如果您将代码更改为此

String dateUtc = "2016-11-09 12:50:00";

你得到这个输出,给出正确的1小时差异。

UTC: 2016-11-09 12:50:00
Lisboa: 2016-11-09 12:50:00
Madrid: 2016-11-09 13:50:00
Paris: 2016-11-09 13:50:00

时区是由于日期对象实际引用的时间。所以那个时候是正确的

答案 1 :(得分:2)

法语接受的答案是正确的。这些值与夏令时(DST)中的转换重叠。

我只是指出你的代码使用旧的日期时间类,现在是旧的,取而代之的是java.time类。

将输入值解析为LocalDateTime,因为它缺少任何时区指示符或与UTC的偏移量。

T替换中间的SPACE,以符合java.time类中默认用于解析/生成字符串的ISO 8601格式。

LocalDateTime ldt = LocalDateTime.parse( "2016-10-09 12:50:00".replace( " " , "T" ) );

我们从业务环境中知道UTC是用于此输入字符串的。因此,指定UTC的偏移量。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );

通过应用ZoneId来调整时区以获得ZonedDateTime

ZoneId z = ZoneId.of( "Europe/Lisboa" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );