【问题标题】:Avoid Daylight Saving Time in calculating weeks in between在计算两者之间的周数时避免夏令时
【发布时间】:2018-08-25 00:32:03
【问题描述】:

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

使用 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,在这种情况下,周数返回 4 从技术上讲是合乎逻辑的,但我只想考虑日期而忽略时间和结果5周。我该怎么做?

【问题讨论】:

标签: time java-8 jodatime dst


【解决方案1】:

java.time

您可以使用 Java 8 及更高版本中内置的 java.time 类,使用 toLocalDate 方法将 ZonedDateTime 转换为 LocalDate

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

这样时间信息就会被删除,因为 LocalDate 不存储时间,只存储日期。

关于“时间向前推 1 小时”,如果您指的是当您使用 toInstant() 时发生这种情况,那是正常的(如果您的系统时区是 UTC + 1),因为即时只“知道”UTC + 0. 但是什么时候使用atZone 应该再次更改为您的系统时区,然后时间被“截断”。

乔达时间

对于Joda-Time,您也可以使用toLocalDate 方法代替toLocalDateTime

dateTime1.toLocalDate();

withTimeAtStartOfDay

dateTime1.withTimeAtStartOfDay();

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 2021-11-14
    • 2012-12-18
    • 2023-01-27
    • 2018-12-26
    • 2013-11-24
    • 2016-08-02
    • 2018-06-15
    相关资源
    最近更新 更多