2017-06-17 143 views
0

我在计算两个日期之间的天数。 这是我的代码:两个日期之间的天数。日期错误在哪里?

public class Main { 
    public static void main(String[] args) { 
     SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 
     Date date1 = null; 
     Date date2 = null; 
     String str1 = "01.01.1900"; 
     String str2 = "16.06.2017"; 
     try{ 
      date1 = format.parse(str1); 
      date2 = format.parse(str2); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     long i1 = date2.getTime() - date1.getTime(); 
     System.out.println(i1/86400000);//milisec to days 
    } 
} 

结果是:42899天。

但如果我们重新检查减法EXCEL,结果是42901 enter image description here

请,有谁能够解释我哪里是真理的结果?

+1

我不能更强烈反对使用传统的'java.util.Date'类。您应该查看'java.time'包并找到最适合您的用例的类(在这种情况下可能是'LocalDate')。 –

+0

你应该使用更近的日期来测试你的代码,例如'01.01.1900'和'02.01.1900'。也许你会发现问题在哪里(或者Excel可能算不同于你)。 –

+0

相同的2天差异 –

回答

2

的Java轮结果下来除以整数的时候,所以我觉得你已经失去了每天在这里:

System.out.println(i1/86400000);//milisec to days 

我试图后的Java 8 API它显示我42900天(请注意,无论是Java的8也不Excel中不包括在范围内的最后一天):

描述
LocalDate from = LocalDate.of(1900, Month.JANUARY, 1); 
LocalDate to = LocalDate.of(2017, Month.JUNE, 16); 
long daysBetween = ChronoUnit.DAYS.between(from, to); 

另一天是用Excel以错误的方式因计算错误0。 因此,回答你的问题 - 你舍去一天舍去,另一天被错误地添加了Excel

+0

非常感谢! –

+0

不正确。 Excel也不包括结束日期。问题出在Excel中,错误地认为1900年是闰年。不是这样。请参阅:[Excel中是否存在有关日期的错误?](https://stackoverflow.com/q/13722566/5221149)---然而,对于舍入问题你是正确的,但是你不解释*为什么是一个舍入问题,即它是由于切换到夏令时时丢失了几个小时而造成的。 – Andreas

+0

@Andreas感谢您指出这一点 - 我已经更新了我的答案。 –

0

使用Joda Time。它具有更好的API,可以在Java的标准库中找到。这是我对你的情况下,代码:

package com.example; 

import org.joda.time.DateTime; 
import org.joda.time.Days; 

public class Main{ 
public static void main(String[] args) { 

    DateTime start = new DateTime(1900, 1, 1, 0, 0, 0, 0); 
    DateTime end = new DateTime(2017, 6, 16, 0, 0, 0, 0); 

    // calculate days between two dates 
    int days = Days.daysBetween(start, end).getDays(); 

    System.out.println("Days = " + days); 
} 
} 

,其结果是Days = 42900

+0

你为什么叫'minusDays(1)'?这只是为了人为地获得与Excel相同的*不正确的结果? – Andreas

+0

哦,我很抱歉。我觉得我有点失职。感谢您的评论!我将修复代码) –

+0

Joda-Time处于维护状态,官方的Joda-Time建议是您迁移到'java.time'。尽管如此,仍然比长期过时的java.util.Date更好。 –