2017-06-17 24 views
0

私は2つの日付間の日数を計算しようとしています。2つの日付の間の日数。日付のエラーはどこですか?

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.time'パッケージを見て、あなたのユースケースに最も適したクラス(この場合はおそらく' LocalDate')を見つけるべきです。 –

+0

「01.01.1900」や「02.01.1900」など、より近い日付を使用してコードをテストする必要があります。たぶんあなたは問題がどこにあるのかを知ることができます(あるいは、Excelはあなたとは異なる何かを数えます)。 –

+0

同じ2日間の差 –

答えて

2

Javaのダウン整数を分割するので、私はあなたがここに一日を失っていると思う:私はのJava 8 APIを試してみました

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

した後、それは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。 あなたの質問に答えてください - 丸めで1日がゆるくなり、別の日が間違ってExcelによって追加されました。

+0

ありがとうございます! –

+0

が正しくありません。 Excelには終了日も含まれていません。問題はExcelであり、1900年がうるう年だと誤って考える。そうではない。参照:[日付に関するExcelにバグはありますか?](https://stackoverflow.com/q/13722566/5221149)---丸めの問題については正しいですが、理由を説明していません。丸め問題です。つまり、夏時間に切り替えると数時間の損失が原因です。 – Andreas

+0

@アンドレアスこれを指摘してくれてありがとう - 私は私の答えを更新しました。 –

0

Joda Timeを使用してください。 Javaのスタンダードライブラリで利用可能な優れたAPIを備えています。ここにあなたのケースのために私のコードです:

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); 
} 
} 

が、結果は私がより強くレガシー `java.util.Date`クラスを使用しないことを助言することはできませんDays = 42900

+0

なぜあなたは 'minusDays(1)'を呼びますか?それは人為的にExcelと同じ*間違った結果を得ることだけですか? – Andreas

+0

ああ、申し訳ありません。私は少し気難しさを感じています。コメントありがとうございます!コードを修正します) –

+0

Joda-Timeはメンテナンス状態ですが、公式のJoda-Time勧告は 'java.time'に移行することです。しかし、古くなった古いjava.util.Dateより優れた選択肢です。 –

関連する問題