gpt4 book ai didi

java - 我怎样才能从给定的瞬间得到两个午夜?

转载 作者:行者123 更新时间:2023-11-29 04:42:31 30 4
gpt4 key购买 nike

我需要计算今天凌晨 00:00 和明天凌晨 00:00。

我正在努力喜欢这个

private static void some(final Date now) {
final Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
final Date min = calendar.getTime(); // 00:00 AM of today
calendar.add(Calendar.DATE, 1);
final Date max = calendar.getTime(); // 00:00 AM of tomorrow
}

有没有更好的(或简单的其他)方法来做到这一点?

最佳答案

您尝试执行的操作存在一些问题。

首先,“今天”对于日期 而言并不是一个明确定义的概念。 Date 基本上只是自 Unix 纪元以来的毫秒数的包装:对应于该时刻的日历日期是不同的,具体取决于您所在的时区。

例如,new Date(1469584693000) 表示的时刻是 2016 年 7 月 27 日在伦敦;但那是在 2016 年 7 月 26 日在纽约。

当然,您可以依赖 JVM 的默认时区,但这会使代码的行为依赖于 JVM 的配置。

其次,“午夜”并不总是存在的:例如在 Asia/Gaza 时区,夏令时从午夜开始,这意味着时钟从一天的 23:59:59 跳到下一天的 01:00:00(参见 Ideone demo )。这就是为什么 Java 8 时间 API 具有称为 atStartOfDay 的方法的原因。 ,而不是 atMidnight

因此,您可以在 Java 8 中将它们放在一起:

private static void some(final Date now, ZoneId zone) {
Instant instant = now.toInstant(); // Convert from old legacy class to modern java.time class.
ZonedDateTime zdt = instant.atZone(zone); // Apply a time zone to the UTC value.
LocalDate today = zdt.toLocalDate(); // Extract a date-only value, without time-of-day and without time zone.

ZonedDateTime startOfDayToday = today.atStartOfDay(zone); // Determine first moment of the day.
ZonedDateTime startOfDayTomorrow = today.plusDays(1).atStartOfDay(zone);

// ...
}

当然也可以直接将InstantZonedDateTime传入方法;并且您可以使用显式常量 ZoneId,例如ZoneId.of("UTC").

关于java - 我怎样才能从给定的瞬间得到两个午夜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607864/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com