Zonedatetime

我有一个返回年,月,日和小时的DTO。 因此将DTO的值传递给ZonedDateTime.of方法。 在这里,时间正在通过PST上午10点。 所以,试图将其转换为UTC。

当将月份设置为5时,它将返回开始时间17PM,并将月份作为2传回开始时间为UTC 18:00。 它正在考虑日光节约。 它应该是UTC的18PM,而不管月份。 有什么办法可以忽略这里的日光节约?

  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”。 我们想要以这种格式处理任何时区。


这可能是一种黑客行为; 但它的工作原理。

    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

这不取决于美国/洛杉矶或太平洋/皮特凯恩的时区,也不取决于使用夏令时(DST)的时区。 它只是补偿夏季时间,如果在有问题的时刻有效。 如果没有夏令时,则添加0。

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

链接地址: http://www.djcxy.com/p/59017.html

上一篇: Zonedatetime

下一篇: PostgresSQL: Adding an interval to a timestamp in a different time zone