在计算两者之间的周数时避免使用夏令时

Avoid Daylight Saving Time in calculating weeks in between

我正在尝试计算两个日期之间的周数。

使用Java SE8

public long weekInBetween(Date date1, Date date2)
{
    return ChronoUnit.WEEKS.between(date1.toInstant().atZone(ZoneId.systemDefault()),
            date2.toInstant().atZone(ZoneId.systemDefault()));
}

使用 Joda 时间

public int weekInBetween(Date date1, Date date2)
{
    DateTime dateTime1 = new DateTime(date1);
    DateTime dateTime2 = new DateTime(date2);
    return Weeks.weeksBetween(dateTime1.toLocalDateTime(), dateTime2.toLocalDateTime()).getWeeks();
}

但是,每当它超过 DST 开始日期,即 3 月 11 日。时间向前推 1 小时,即从 UTC-8 变为 UTC-7 的日期。因此,中间的周数不正确,比预期早了 1 周。

例如,date1Mon Feb 05 08:00:00 UTC 2018date2Mon Mar 12 07:00:00 UTC 2018,周数returns4在这种情况下在技术上是合乎逻辑的,但是我只想考虑日期而忽略时间和结果为 5 周。我该怎么做?

java.time

您可以使用 java.time 类 内置到 Java 8 及更高版本中来转换 ZonedDateTime to LocalDate with the method toLocalDate

date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

这种方式会删除时间信息,因为 LocalDate 不存储时间,只存储日期。

关于“时间向前推1小时”,如果你指的是你使用toInstant()时出现这种情况,那是正常的(如果你的系统时区是UTC+1),因为instant only 'knows' UTC + 0。但是在使用atZone的时候又要换成你的系统时区,那么时间就是'truncated'.

Joda-Time

对于Joda-Time, you could aso use the toLocalDate method instead toLocalDateTime

dateTime1.toLocalDate();

withTimeAtStartOfDay

dateTime1.withTimeAtStartOfDay();