获取以前发生的LocalTime

时间:2015-06-29 16:00:31

标签: java time

如何将系统时区的指定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。

编辑1

如果今天没有出现指定的时间(由于时区转换),应返回时区转换的瞬间。如果今天有两次指定时间,则应返回过去的最新日期。

编辑2

在与产品负责人核实后,事实证明,如果一天内发生两次指定时间,则始终返回第一次(或始终返回第二次)是正常的。我们不需要两者。

1 个答案:

答案 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();
    }
}