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

标签 java date time calendar

我需要计算今天凌晨 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/

相关文章:

date - Lua - 获取当前日期?

java.lang.NoClassDefFoundError : sun/security/ssl/HandshakeStateManager

java - 更新 Set 中的对象

javascript - MongoDB ISODate() 给出的结果与 Date() 不同吗?

r - 在 R 中提取奇怪格式 (EURO MTH/MM/YYYY) 的日期

c++ - 两个独立的 tm 结构相互镜像

java - 将带有 html/Javascript 的字符串放入 selenium webdriver

java - 使用 Java 以独立模式运行 Spark

datetime - 获取 PHP DatePeriod 对象的开始和结束日期?

time - 序言 : what do the results from calling time/1 actually mean?