1

我有一个返回年、月、日和小时的 DTO。因此,将 DTO 中的值传递给 ZonedDateTime.of 方法。在这里,时间是太平洋标准时间上午 10 点过去。因此,尝试将其转换为 UTC。

当月份为 5 时,它返回开始时间 17PM,当月份为 2 时,它返回开始时间为 18PM UTC。它正在考虑节约日光。无论月份如何,它都应该是世界标准时间晚上 18 点。有什么办法可以忽略这里的日光节约吗?

  TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");

  final ZonedDateTime jobStartDateTimeZ = ZonedDateTime.of(2017, 5, 1, 10,
                    0, 0, 0, tz.toZoneId());

  Instant startTime = jobStartDateTimeZ.withZoneSameInstant(ZoneOffset.UTC).toInstant();

  System.out.println("Start Time "+startTime);

我们使用旧系统,字符串将位于 DB 中的“America/Los_Angeles”中,并且可以有任何时区,例如“America/Bahia”。我们想为任何时区处理这种格式。

4

1 回答 1

2

这可能是一个黑客;但它有效。

    ZoneId tz = ZoneId.of("America/Los_Angeles");
    final ZonedDateTime jobStartDateTimeZ = ZonedDateTime.of(2017, 5, 1, 10, 0, 0, 0, tz);
    Instant startTime = jobStartDateTimeZ.toInstant();
    // add summer time (DST)
    startTime = startTime.plus(tz.getRules().getDaylightSavings(startTime));
    System.out.println("Start Time " + startTime);

这打印

开始时间 2017-02-01T18:00:00Z

这不取决于时区是 America/Los_Angeles 或 Pacific/Pitcairn,也不取决于使用夏令时 (DST) 的时区。如果一个在相关瞬间生效,它只是补偿夏季时间。如果没有夏令时,则添加 0。

顺便说一句,不要使用过时的TimeZone类。现代ZoneId是一个很好的替代品。无论如何,withZoneSameInstant()当您转换为之后也是不必要的,Instant

于 2018-02-28T11:03:20.653 回答