2015-08-08 68 views
2

冉下面的代碼:差距在時間跨越JDK版本

import java.util.Calendar; 
import java.util.Date; 
import java.util.TimeZone; 

public class CalendarTest { 
    public static void main(String args[]) { 
     int[] constants = { Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND }; 
     Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("ART")); 
     cal1.set(Calendar.AM_PM, Calendar.AM); 
     cal1.set(Calendar.DAY_OF_MONTH, 1); 
     cal1.set(Calendar.MONTH, 5); 
     cal1.set(Calendar.YEAR, 2015); 
     for (int i = 0; i < constants.length; ++i){ 
      cal1.set(constants[i], 0); 
     } 
     System.out.println(cal1.getTimeInMillis() + " | " + new Date(cal1.getTimeInMillis())); 
    } 
} 

Output for JDK_1.7.0_76: (time zone database 2014j) 
1433106000000 | Mon Jun 01 02:30:00 IST 2015 

Output for JDK_1.8.0_51: (time zone database 2015d) 
1433109600000 | Mon Jun 01 03:30:00 IST 2015 

Output for JDK_1.8.0_40: (time zone database 2014j) 
1433106000000 | Mon Jun 01 02:30:00 IST 2015 

據我所知,阿根廷和印度不遵守夏令截至2015年6月1日,但我在JDK版本之間的時間觀察差異。


更新:您如何建議在數據庫中存儲時間以適應此類錯誤?

回答

1

請注意time zone database 2014j。顯然,2015年有一個數據庫更新,反映了新的DST規則。

就存儲時間而言,這很容易:持續或發送的日期應該是UTC或ISO8601的區域偏移量,並且格式化爲持久顯示。在SQL中,這意味着UTC。