// 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 是在同一天还是在前一天,而不做太多重量级的东西。
这是否考虑了夏令时?为什么?如果不是,最简单的逻辑是什么?
最佳答案
您当前的代码不会对本地时区做任何事情 - 一切都在 UTC 中,有效地(当然就您的代码而言,它处理的是“自 Unix 纪元以来的毫秒数”) .
如果你想让你的代码时区敏感,你应该使用(按优先顺序):
- Java 8 的
java.time
(例如ZonedDateTime
和Clock
) - Joda Time
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
}
}
请注意这里没有任何低级别 - 我们只是计算出每个值(不时)在给定时区内的哪个日期,然后比较它们。
关于java - 这是否考虑了夏令时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22964732/