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

Time 在计算两周之间的时间时避免使用夏令时,time,java-8,jodatime,dst,Time,Java 8,Jodatime,Dst,我试图计算两次约会之间的周数 使用JavaSE8 public long weekInBetween(Date date1, Date date2) { return ChronoUnit.WEEKS.between(date1.toInstant().atZone(ZoneId.systemDefault()), date2.toInstant().atZone(ZoneId.systemDefault())); } 利用乔达时间 public int wee

我试图计算两次约会之间的周数

使用JavaSE8

public long weekInBetween(Date date1, Date date2)
{
    return ChronoUnit.WEEKS.between(date1.toInstant().atZone(ZoneId.systemDefault()),
            date2.toInstant().atZone(ZoneId.systemDefault()));
}
利用乔达时间

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 <代码> MUNEB 05 08:00 00 UTC 2018 和<代码> DATE2 <代码> 3月12日07:00 00 UTC 2018 <代码>,星期数返回4,在本例中技术上是合理的,但我只考虑日期,忽略时间和结果为5周。我该怎么做?

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

date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
由于LocalDate不存储时间,只存储日期,因此时间信息被擦除

关于“时间向前推1小时”,如果您使用
toInstant()
,这是正常的(如果您的系统时区是UTC+1),因为只有instant“知道”UTC+0。但是当使用atZone时,它应该再次更改为您的系统时区,然后时间被“截断”

乔达时间 例如,您可以使用该方法

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

date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
由于LocalDate不存储时间,只存储日期,因此时间信息被擦除

关于“时间向前推1小时”,如果您使用
toInstant()
,这是正常的(如果您的系统时区是UTC+1),因为只有instant“知道”UTC+0。但是当使用atZone时,它应该再次更改为您的系统时区,然后时间被“截断”

乔达时间 例如,您可以使用该方法

仅供参考,该项目目前正在进行中,团队建议迁移到类。请参阅。仅供参考,该项目目前正在进行中,团队建议迁移到类。看见
dateTime1.withTimeAtStartOfDay();