如何将系统时区的指定local time的上一次出现设为instant?
这基本上意味着今天在指定时间或指定时间到达,取决于今天的指定时间是在现在之前还是之后。
当然,由于夏令时,我需要考虑时区切换。也就是说,今天和昨天的时区偏移量可能不同。
这就是我现在所拥有的:
public Instant getPreviousOccurence(LocalTime scheduledTime) {
Instant now = Instant.now();
Instant todayAtSpecifiedTime = now.with(scheduledTime);
return todayAtSpecifiedTime.isAfter(now) ? todayAtSpecifiedTime.minus(1, ChronoUnit.DAYS) : todayAtSpecifiedTime;
}
但是在检查了Instant.minus()
的来源之后,我注意到它每天会删除84600秒,这在我的情况下是错误的。另外,我不确定Instant.with()
是否会使用系统时区或UTC。
如果今天没有出现指定的时间(由于时区转换),应返回时区转换的瞬间。如果今天有两次指定时间,则应返回过去的最新日期。
在与产品负责人核实后,事实证明,如果一天内发生两次指定时间,则始终返回第一次(或始终返回第二次)是正常的。我们不需要两者。
答案 0 :(得分:0)
非常感谢Jon Skeet将我指向ZonedDateTime。这是我使用此类型的解决方案。
public Instant getPreviousOccurence(LocalTime scheduledTime) {
Instant now = Instant.now();
ZonedDateTime todayAtScheduledTime = ZonedDateTime.ofInstant(now, EUROPE_PARIS).with(scheduledTime).withEarlierOffsetAtOverlap();
if (todayAtScheduledTime.toInstant().isAfter(now)) {
return todayAtScheduledTime.minusDays(1).withEarlierOffsetAtOverlap().toInstant();
} else {
return todayAtScheduledTime.toInstant();
}
}