Java - Zoneddatetime - 没有夏令时

问题描述 投票:1回答:1

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

当月份为5时,它返回17PM的开始时间,当月份为2时,它将开始时间返回到UTC时间18PM。正在考虑节日照明。它应该是18PM UTC,无论月份如何。有没有办法在这里忽略日光节约?

  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”。我们希望处理任何时区的这种格式。

java dst datetime-conversion zoneddatetime
1个回答
1
投票

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

    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也是不必要的,

© www.soinside.com 2019 - 2024. All rights reserved.