// 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是在同一天还是在前一天没有做太多重量级的东西。
这是否可以节省日光?为什么?如果没有,最简单的逻辑是什么?
答案 0 :(得分:4)
您当前的代码没有使用本地时区进行任何 - 所有内容都是UTC,有效(当然,就您的代码而言,这是处理"毫秒以来Unix时代")。
如果您想让您的代码对时区敏感,您应该使用(按照优先顺序):
java.time
(例如ZonedDateTime
和Clock
)java.util.Calendar
与java.util.TimeZone
尽可能使用更高级别的抽象 - 您的代码应尽可能少地进行低级别的操作。
编辑:现在我们知道了目的,这是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(),它将返回一个日期是否在另一个日期之前。