我有UTC的时间戳。我将其转换为本地时间。我的时区是CET / CEST。
2018-10-03 12:00 UTC => 14:00 CEST
2018-10-30 12:00 UTC => 13:00 CET
由于我的时区,系统会自动应用正确的偏移量:如果我在夏天转换时间戳,则它会自动增加2小时(无论我转换成什么时间),如果在冬天,它将自动增加1小时。
到目前为止-很好。
现在,我想根据另一个引用的时间戳转换UTC时间戳。 如果参考是在夏季,则应始终加上2小时-不管转换的时间戳是夏天还是冬天-如果参考是在冬季,则应始终添加1小时。
Ref = 01.01.2018 = CET
2018-10-03 12:00 UTC => 13:00 CET
2018-10-30 12:00 UTC => 13:00 CET
Ref = 01.10.2018 = CEST
2018-10-03 12:00 UTC => 14:00 CEST
2018-10-30 12:00 UTC => 14:00 CEST
因此,如果我的系统运行正常的CEST / CET,我如何找出参考时间戳(以UTC为单位)具有哪个时区(或UTC的偏移量?)?
我通常使用ZonedDateTime。
答案 0 :(得分:2)
您可以从参考文献ZoneId
中获得ZonedDateTime
,并使用它来将UTC
中的时间戳调整到该区域:
设置
ZoneId cet = ZoneId.of("CET");
// The reference timestamps, these could be any ZonedDateTime
// but I specifically make one for winter and one for summer
ZonedDateTime refWinter = ZonedDateTime.of(LocalDateTime.parse("2018-01-01T12:00"), cet);
ZonedDateTime refSummer = ZonedDateTime.of(LocalDateTime.parse("2018-10-01T12:00"), cet);
// The UTC timestamp that you want to convert to the reference zone
ZonedDateTime utc = ZonedDateTime.of(LocalDateTime.parse("2018-10-03T12:00"), ZoneOffset.UTC);
转化
// The converted timestamps
ZonedDateTime convertedWinter = utc.withZoneSameInstant(refWinter.getOffset());
ZonedDateTime convertedSummer = utc.withZoneSameInstant(refSummer.getOffset());
System.out.println(convertedWinter); // 2018-01-03T13:00+01:00
System.out.println(convertedSummer); // 2018-10-03T14:00+02:00
答案 1 :(得分:-2)
如果日期在UTC中,则可以将其从字符串解析为Date对象,然后可以将其转换回本地时区中的字符串。请检查以下代码示例:
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = isoFormat.parse("2018-10-03 12:00");
isoFormat.setTimeZone(TimeZone.getDefault());
System.out.println("Date in my local timezone is "+isoFormat.format(date));