java中为什么toMillis()函数返回-1

java中为什么toMillis()函数返回-1,java,android,time,Java,Android,Time,在android中,当运行下面的代码段时,date3返回-1 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

在android中,当运行下面的代码段时,date3返回-1

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,而不是预期值

我不明白,也没有找到任何合适的理由或解决办法。
请让我知道,如果我做错了什么,或者是否有其他方法可以找到该日期后的毫秒值。

这就是影响类
android.text.format.Time
()的2038年问题。这是UNIX的典型问题。课程的文档上写着:

“它是以struct tm建模的,事实上,它使用struct tm来实现大部分功能。”

因此,它在后台使用了一种在UNIX系统上也很普遍的方法。此数据类型只有32位,因此2038年将发生整数溢出。最后,您可以期待未来的错误修复,请参阅以下Android错误报告:

:android.text.format.Time not year 2038 safe

一个解决方法是使用开源第三方库

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
米利斯:4071006245000