我需要计算今天凌晨 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);
// ...
}
当然也可以直接将Instant
或ZonedDateTime
传入方法;并且您可以使用显式常量 ZoneId
,例如ZoneId.of("UTC")
.
关于java - 我怎样才能从给定的瞬间得到两个午夜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607864/