Java 考虑时区因素,确定一个瞬间是否是另一个瞬间的第二天

Java 考虑时区因素,确定一个瞬间是否是另一个瞬间的第二天,java,java-time,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小时)中a之后的第二天,程序将比较: 17年11月28日晚上1

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

时区将作为参数提供

例如,考虑:

Instant a = Instant.ofEpochSecond(1511928000L); // 11/29/17 4 AM
Instant b = Instant.ofEpochSecond(1511935200L); // 11/29/17 6 AM
如果用户想知道b是否是东部时区(-5小时)中a之后的第二天,程序将比较:


17年11月28日晚上11点的即时a和17年11月29日凌晨1点的即时b,并确定b是a之后的第二天。

可以使用
ZoneId.getAvailableZoneIds()
获得正确的区域id。 这对于国家/地区的日间储蓄非常有用

除ZoneDateTime外,还可以执行以下操作:

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

评论后,提出更好的解决方案-针对不同年份的同一天:

ZoneId zoneId = ZoneId.of("UTC-5h");
ZonedDateTime ad = ZonedDateTime.ofInstant(a, zoneId).truncatedTo(ChronoUnit.DAYS);
ZonedDateTime bd = ZonedDateTime.ofInstant(b, zoneId).truncatedTo(ChronoUnit.DAYS);
return !ad.equals(bd);

使用
ZoneId.getAvailableZoneId()
可以获得正确的区域id。 这对于国家/地区的日间储蓄非常有用

除ZoneDateTime外,还可以执行以下操作:

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

评论后,提出更好的解决方案-针对不同年份的同一天:

ZoneId zoneId = ZoneId.of("UTC-5h");
ZonedDateTime ad = ZonedDateTime.ofInstant(a, zoneId).truncatedTo(ChronoUnit.DAYS);
ZonedDateTime bd = ZonedDateTime.ofInstant(b, zoneId).truncatedTo(ChronoUnit.DAYS);
return !ad.equals(bd);
找到了一个解决方案:

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);
}
找到了一个解决方案:

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);
}

创建ZonedDateTime s,然后比较日期。创建ZonedDateTime s,然后比较日期。如果你碰巧比较,比如说,去年11月28日和今年11月28日,那么仅仅比较一年中的某一天是很脆弱的。@OleV.V。问题是关于天数限制,但你是对的;扩展了答案,但是OP自己的答案,简单的LocalDate+ZoneId似乎更合适。我承认我不信任LocalDate。如果你碰巧比较一下,比如说,去年11月28日和今年11月28日,那么仅仅比较一年中的某一天是很脆弱的。@OleV.V。问题是关于天数限制,但你是对的;扩展了答案,但是OP自己的答案,简单的LocalDate+ZoneId似乎更合适。我承认我不信任这里的LocalDate。