这是否适用于夏令时?

时间:2014-04-09 13:51:46

标签: java

// 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)

编辑:我的目的是检查someTime是在同一天还是在前一天没有做太多重量级的东西。

这是否可以节省日光?为什么?如果没有,最简单的逻辑是什么?

3 个答案:

答案 0 :(得分:4)

您当前的代码没有使用本地时区进行任何 - 所有内容都是UTC,有效(当然,就您的代码而言,这是处理"毫秒以来Unix时代")。

如果您想让您的代码对时区敏感,您应该使用(按照优先顺序):

尽可能使用更高级别的抽象 - 您的代码应尽可能少地进行低级别的操作。

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

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
    }
}

请注意这里没有什么低级别 - 我们只计算每个值(现在和时间)落在给定时区内的日期,然后进行比较。

答案 1 :(得分:0)

在某些情况下,考虑到夏令时,您的检查将会失败。我们假设它现在是在夏令时发生的那一天的5点钟,而在3点我们已经将时钟向前切换。因此,午夜过去只有4个小时,但实际上是5个。因此,代码中的midnight将是5小时前的时间。这意味着,如果someTime介于5小时前和4小时前(例如4个半小时前),那么实际上是昨天你的算法将报告它已经是今天。

答案 2 :(得分:0)

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