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

当通过月份为5时,它将返回开始时间17PM;当通过月份为2时,它将返回开始时间为18PM 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);


我们使用的是旧版系统,该字符串将位于数据库的“ 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


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

顺便说一句,不要使用过时的TimeZone类。现代的ZoneId是很好的替代品。同样,当您随后转换为withZoneSameInstant()时,也不需要Instant

09-04 03:54