2017-03-22 142 views
1

东西似乎不正确,我只是不知道我可以如何解决它。不同的时间间隔util.date和DAYS.between(本地时间)

我想知道2日期之间的天数差异。现在我实现了一个功能,它计算到天,从毫秒的差异为util.date对象

public long calculateNumberOfDays(Date from, Date to) { 
    return (to.getTime() - from.getTime())/(1000*60*60*24); 
} 

我的JUnit测试告诉我,有这个功能的错误,所以我重写它使用LOCALDATE的和ChronoUnit。 DAYS.between函数。它像一个魅力。

想知道什么这两个函数之间的差异,我写了这个小测试:

for(int numberDays = 1; numberDays<10; numberDays++){ 
     LocalDate fromLD = LocalDate.now(); 
     LocalDate toLD = fromLD.plusDays(numberDays); 
     Date fromD = Date.valueOf(fromLD); 
     Date toD = Date.valueOf(toLD); 
     long diffMS = toD.getTime() - fromD.getTime(); 
     double diffDays = diffMS/(1000*60*60*24); 
     long numDaysDate = DAYS.between(fromLD, toLD); 
     System.out.println(numberDays+" = "+diffDays+"/"+numDaysDate); 
} 

它带来了以下的输出:

1 = 1.0/1 
2 = 2.0/2 
3 = 3.0/3 
4 = 4.0/4 
5 = 4.0/5 
6 = 5.0/6 
7 = 6.0/7 
8 = 7.0/8 
9 = 8.0/9 

能有人向我解释,如何这个有可能? (1-4它工作,5-9 util.date已经损失了一天)

+0

貌似夏令时间即将开始.... –

+0

我没有知道今年我们节省了一整天的时间:P – Nexxurs

+0

我已经给出了答案,但整数(或长整数)的部分向下舍入 –

回答

3

日期很难。 java Date是日期和时间,所以当您将其设置为实际日期时,意味着该日期是午夜。

夏令时现在在任何一天(至少在这里)踢球,所以周一的午夜将在周日午夜23点后。

除以整数向下舍入,所以4天小时和23小时是4天

铸造一个整数除法为双的结果是太晚;你需要转换的输入一个或两个:

double diffDays = diffMS/(1000*60*60*24); 

4.0

double diffDays = diffMS/(1000.0*60*60*24); 

4.958333 ......

+0

您是对的,谢谢。我想我已经通过使diffDays成为双重价值来覆盖它。当我将diffMS解析为double然后分割时,会生成正确的double值。 – Nexxurs

+0

当我说日期很难,我的意思是*可笑*很难做日期/时间操作而不会触及这类错误。有一个原因java 8包含第三次尝试(在java.util.Date和java.util.Calendar之后)以提供工具。你很幸运,你在DST之前一周测试了这个。 –