这是否考虑了夏令时?

5
// 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)
编辑: 我的目的是检查某个时间是否在同一天或前一天,而不进行过多的重量级操作。

这是否考虑了夏令时?如果没有,最简单的逻辑是什么?


如果你输入 new Date(); ,那么它表示你正在引用你系统的当前日期。无论你的系统日期设置为什么,你都会得到那个时间。 - Stunner
1
@MarounMaroun 我认为问题实际上是“在考虑到可能的夏令时转换的情况下,使用这段代码是否安全”。 - Ivaylo Strandjev
你实际上想要实现什么?如果不知道目标,我们很难为您提供有效的代码来实现您想要的结果。 - Jon Skeet
1
你是在UTC时区进行计算的,根据定义它没有夏令时。 - Meno Hochschild
3个回答

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

请注意,这里没有涉及任何低级操作 - 我们只是在确定每个值(现在和过去)在给定时区内的日期,并进行比较。

0

考虑到夏令时的影响,您的检查在某些情况下可能会失败。假设现在是夏令时开始的那一天的5点钟,而在3点钟我们已经将时钟向前调整了一个小时。因此,自午夜以来只过去了4个小时,但实际上是5点钟。因此,在您的代码中,midnight将是5小时之前的时间。这意味着,如果someTime在5小时前和4小时前(例如4个半小时前)之间,当实际上是昨天时,您的算法将报告它是今天。


0

从夏令时的角度来看,那似乎不正确。首先,someTime日期的时区是什么?在夏令时开始/结束的那些日子/晚上(实际上)呢(加减一小时)? 如果您使用Joda库,则有一个方便的方法DateTime.isBefore(),它将返回一个日期是否在另一个日期之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接