Java:ZonedDateTime-获取参考时间戳的偏移量

时间:2018-10-30 13:54:53

标签: java datetime zoneddatetime

我有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。

2 个答案:

答案 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));