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