2014-03-29 60 views
4

在Android中,在運行下面的代碼片段,DATE3返回-1爲什麼toMillis()函數返回-1在java中

booking_year2 = 2038; 
booking_month2 = 1; 
booking_day2 = 17; 
Time t = new Time(); 
t.set(booking_day2, booking_month2 - 1, booking_year2); 
long date3 = t.toMillis(false); 
//date3 returns 2147451300000 as expected 

//But if we run with values: 
booking_year2 = 2038; 
booking_month2 = 1; 
booking_day2 = 18; 
//date3 returns -1 

雖然,時間對象「T」已經預期值時, toMillis()函數返回的long值僅爲-1。 而且,對於2038年1月19日之後的所有日期上限值,toMillis()函數只返回-1而不是期望值。

我沒有理解,也沒有找到任何合適的理由或解決方案。 請讓我知道,如果我做錯了什麼或有什麼其他的方式來查找這個日期後的毫秒值。

+2

http://en.wikipedia.org/wiki/Year_2038_problem? – zapl

回答

2

這就是影響類android.text.format.Timeandroid class)的年2038年問題。這個問題對UNIX來說很典型。並且該類的文檔說:

「它建模在struct tm之後,實際上,它使用struct tm來實現大多數功能。」

因此,它在後臺使用了一個C++-solution,這在UNIX系統上也很普遍。這個數據類型只有32位,所以在2038年會發生整數溢出。最後,你可以在未來的bug修正希望看到的Android以下錯誤報告:

Issue 37653:android.text.format.Time不是2038年

0

一種解決方法是使用Joda-Time,開源三階黨的圖書館。

DateTime dateTime = new DateTime(2099, 1, 2, 3, 4, 5, DateTimeZone.UTC); 
long millis = dateTime.getMillis(); 

轉儲到控制檯...

System.out.println("dateTime: " + dateTime); 
System.out.println("millis: " + millis); 

當運行...

dateTime: 2099-01-02T03:04:05.000Z 
millis: 4071006245000 
相關問題