2017-06-17 131 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更好。 –

相關問題