确定一个Instant是否是一个又一个Instant,考虑时区

时间:2017-11-28 16:08:40

标签: java java-time

时间戳将存储在数据库中。什么是解决方案来确定一个名为“b”的时间戳是否是另一个时间戳之后的一天,称为“a”?

时区将作为参数提供。

例如,考虑:

Instant a = Instant.ofEpochSecond(1511928000L); // 11/29/17 4 AM
Instant b = Instant.ofEpochSecond(1511935200L); // 11/29/17 6 AM

如果用户想知道b是否是东区时区(-5小时)之后的第二天,该程序将进行比较:

在11/28/17 11 PM和即时b在11/29/17凌晨1点即时a,并确定b是a之后的第二天。

2 个答案:

答案 0 :(得分:3)

找到解决方案:

public static void main(String[] args) {
    Instant a = Instant.ofEpochSecond(1511928000L); // 11/29/17 4 AM
    Instant b = Instant.ofEpochSecond(1511935200L); // 11/29/17 6 AM
    ZoneId localZone = ZoneId.of("America/New_York"); // Can be any zone ID

    if (isBOneDayAfterA(a, b, localZone)) {
        System.out.println("b is one day after a!");
    } else {
        System.out.println("b is NOT one day after a");
    }
}

public static boolean isBOneDayAfterA(Instant a, Instant b, ZoneId localZone) {
    LocalDateTime aAdjusted = LocalDateTime.ofInstant(a, localZone);
    LocalDateTime bAdjusted = LocalDateTime.ofInstant(b, localZone);
    LocalDate aDate = aAdjusted.toLocalDate();
    LocalDate bDate = bAdjusted.toLocalDate();

    return bDate.minusDays(1).equals(aDate);
}

答案 1 :(得分:2)

可以使用REINDEX SYSTEM获取正确的区域ID。 这对于白天特定的白天保存非常有用。

除了ZonedDateTime之外,还有以下几点:

ZoneId.getAvailableZoneIds()

在评论出更好的解决方案之后 - 在不同年份的同一天:

ZoneId zoneId = ZoneId.of("UTC-5h");
OffsetDateTime ad = OffsetDateTime.ofInstant(a, zoneId);
OffsetDateTime bd = OffsetDateTime.ofInstant(b, zoneId);
return ad.getDayOfYear() != bd.getDayOfYear();