Java 这算不算夏令时?

Java 这算不算夏令时?,java,Java,编辑:我的目的是检查某个时间是在同一天还是在前一天,不要做太多重量级的事情 这算不算日间储蓄?为什么?如果不是,最简单的逻辑是什么?您当前的代码与本地时区没有任何关系-所有内容都有效地以UTC为单位(当然是您的代码,它以“Unix时代以来的毫秒”为单位) 如果要使代码对时区敏感,应使用(按优先顺序): Java8的Java.time(查看和示例) java.util.Calendarwithjava.util.TimeZone 尽可能使用更高级别的抽象-您的代码应该尽可能少地进行低级别的时

编辑:我的目的是检查某个时间是在同一天还是在前一天,不要做太多重量级的事情


这算不算日间储蓄?为什么?如果不是,最简单的逻辑是什么?

您当前的代码与本地时区没有任何关系-所有内容都有效地以UTC为单位(当然是您的代码,它以“Unix时代以来的毫秒”为单位)

如果要使代码对时区敏感,应使用(按优先顺序):

  • Java8的
    Java.time
    (查看和示例)
  • java.util.Calendar
    with
    java.util.TimeZone
尽可能使用更高级别的抽象-您的代码应该尽可能少地进行低级别的时间操作

编辑:现在我们知道了目的,下面是Joda Time中的一个示例实现:

// someTime is epoch in millis (UTC)

final long timeNow = new Date().getTime();
final long midnight = timeNow - timeNow % (3600 * 24 * 1000L);
final long yesterdayMidnight = midnight - (3600 * 24 * 1000L);


// check if same day.
if (someTime >= midnight)
   // do something

// check if yesterday
if (someTime >= yesterdayMidnight)

请注意,这里没有低水平-我们只是计算出每个值(不时)在给定时区内的日期,然后比较这些日期。

考虑到夏令时,在某些情况下,您的检查将失败。让我们假设现在是夏时制实施当天的5点钟,3点钟时我们将时钟向前拨。因此,从午夜开始只有4个小时过去了,但实际上已经是5个小时了。因此,您的代码中的
midnight
将是
5小时前的时间。这意味着如果
某个时间
在5个小时前和4个小时前(例如4个半小时前)之间,而事实上是昨天,则您的算法将报告今天的情况

从夏令时来看,这似乎不正确。首先,某天的时区是什么?夏令时(一小时+/-)的白天/夜晚(事实上)如何?
如果使用Joda lib,有一个方便的方法DateTime.isBefore(),它将返回一个日期是否在另一个日期之前。

如果使用new date(),这意味着您指的是系统的当前日期。无论您的系统的日期设置为什么,您都只能获得该时间。@Marounnaroun我相信问题实际上是“考虑到可能的夏令时切换,使用此代码是否安全”。您实际想要实现什么?在不知道目标的情况下,我们不能轻易地为您提供好的代码来实现您想要的结果。您使用UTC时区计算,根据定义,UTC时区没有夏令时。
public void calculate(Instant now, Instant then, DateTimeZone zone) {
    LocalDate today = new LocalDate(now, zone);
    LocalDate otherDay = new LocalDate(then, zone);
    if (otherDay.equals(today)) {
        // Today day
    } else if (otherDay.equals(today.minusDays(1)) {
        // Yesterday
    } else {
        // Neither today nor yesterday
    }
}