最常見的 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
避免這個問題的方法:
使用 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());
把timezone切换到GMT