【问题标题】:Different time interval util.date and DAYS.between(Localtime)不同的时间间隔 util.date 和 DAYS.between(Localtime)
【发布时间】:2017-08-14 09:57:09
【问题描述】:

似乎有些不对劲,我只是不知道如何解决它。

我想知道两个日期之间的天数差异。现在我实现了一个函数,它计算 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 已经输了一天)

【问题讨论】:

  • 看起来夏令时即将开始......
  • 我不知道今年我们节省了一整天 :P
  • 我做了一个答案,但整数(或长)除法向下舍入

标签: java time java.util.date localdate


【解决方案1】:

日期很难。 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...

【讨论】:

  • 你说得对,谢谢。我以为我可以通过将 diffDays 设置为双重值来解决这个问题。当我将 diffMS 解析为双精度然后除法时,会生成正确的双精度值。
  • 当我说日期很难时,我的意思是可笑地很难在不遇到这种错误的情况下进行日期/时间操作。 java 8 包含提供工具的第三次尝试(在 java.util.Date 和 java.util.Calendar 之后)是有原因的。很幸运,您在 DST 前一周进行了测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2023-03-13
相关资源
最近更新 更多