最常見的 Java 計算日期差方法是有問題的

最常見的 Java 計算日期差方法,就是取毫秒相減除以一天的毫秒數,但這方法其實有問題

之前在做日期相關的東西時,剛好看到這篇

Java – calculate the difference between two dates

他指出當2個日期包含日光節約時間的起始時,算出來的天數會少一天

他的範例程式用的是倫敦時區,不過 台灣也實施過日光節約時間

程式稍微改一下,就會發現台灣時區也有同樣問題

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Taipei"));

Date d3 = new Date("03/31/1974 12:00:00");
Date d4 = new Date("04/01/1974 12:00:00");

結果:

133934400000
134017200000
82800000
Manual – Days between: 31-三月-1974 and 01-四月-1974 is: 0
Calendar – Days between: 31-三月-1974 and 01-四月-1974 is: 1

避免這個問題的方法

  1. Java 7 似乎會提供 JSR 310 裡面應該會有可計算日期差的 API
  2. 使用 Joda-Time library

使用 Joda-Time 範例如下:

DateTime d1 = new DateTime(1974, 3, 31, 12, 0, 0, 0);
DateTime d2 = new DateTime(1974, 4, 1, 12, 0, 0, 0);
Days d = Days.daysBetween(d1, d2);
System.out.println(d.getDays());

1 關於 “最常見的 Java 計算日期差方法是有問題的” 的評論

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *