Java - Zoneddatetime - 没有夏令时
Java - Zonedatetime - Without Daylight Saving
我有一个 returns 年、月、日和小时的 DTO。因此将值从 DTO 传递给 ZonedDateTime.of 方法。在这里,时间传递为太平洋标准时间上午 10 点。因此,尝试将其转换为 UTC。
当传递月份为 5 时,它 returns 开始时间为下午 17 点,当传递月份为 2 时,它返回开始时间为下午 18 点 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);
我们使用遗留系统,字符串将在数据库中的 "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);
这会打印
Start Time 2017-02-01T18:00:00Z
这不取决于时区是 America/Los_Angeles 还是 Pacific/Pitcairn,它不取决于时区是否使用夏令时 (DST)。如果一个在所讨论的时刻有效,它只是补偿夏令时。如果没有夏令时,则加0。
顺便说一句,不要使用过时的 TimeZone
class。现代 ZoneId
是一个很好的替代品。另外 withZoneSameInstant()
之后转换为 Instant
是不必要的,
我有一个 returns 年、月、日和小时的 DTO。因此将值从 DTO 传递给 ZonedDateTime.of 方法。在这里,时间传递为太平洋标准时间上午 10 点。因此,尝试将其转换为 UTC。
当传递月份为 5 时,它 returns 开始时间为下午 17 点,当传递月份为 2 时,它返回开始时间为下午 18 点 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);
我们使用遗留系统,字符串将在数据库中的 "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);
这会打印
Start Time 2017-02-01T18:00:00Z
这不取决于时区是 America/Los_Angeles 还是 Pacific/Pitcairn,它不取决于时区是否使用夏令时 (DST)。如果一个在所讨论的时刻有效,它只是补偿夏令时。如果没有夏令时,则加0。
顺便说一句,不要使用过时的 TimeZone
class。现代 ZoneId
是一个很好的替代品。另外 withZoneSameInstant()
之后转换为 Instant
是不必要的,