在计算两者之间的周数时避免使用夏令时
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 周。
例如,date1
是Mon Feb 05 08:00:00 UTC 2018
,date2
是Mon 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();
dateTime1.withTimeAtStartOfDay();
我正在尝试计算两个日期之间的周数。
使用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
,周数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();
dateTime1.withTimeAtStartOfDay();