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

时间:2018-03-16 02:32:00

标签: time java-8 jodatime dst

我试图计算两个日期之间的周数。

使用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周。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

java.time

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

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

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

关于"时间推进1小时",如果您在使用toInstant()时提到这种情况,这是正常的(如果您的系统时区是UTC + 1),因为瞬间只知道' UTC + 0.但是何时使用atZone它应该再次更改为您的系统时区,然后时间被截断'。

约达时间

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

dateTime1.toLocalDate();

withTimeAtStartOfDay

dateTime1.withTimeAtStartOfDay();