Java 考虑时区因素,确定一个瞬间是否是另一个瞬间的第二天
时间戳将存储在数据库中。确定一个称为“b”的时间戳是否是另一个称为“a”的时间戳的第二天的解决方案是什么 时区将作为参数提供 例如,考虑: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
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。