我试图计算两个日期之间的周数。
使用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周。
例如,date1
为Mon Feb 05 08:00:00 UTC 2018
,date2
为Mon Mar 12 07:00:00 UTC 2018
,周数返回4,在这种情况下技术上合乎逻辑,但我只想考虑日期并忽略时间和结果为5周。我怎么能这样做?
答案 0 :(得分:3)
您可以使用方法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();
dateTime1.withTimeAtStartOfDay();