Monday, January 3, 2011

最常見的 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 comment: