【问题标题】:why toMillis() function returning -1 in java为什么 toMillis() 函数在 java 中返回 -1
【发布时间】:2014-03-29 12:09:47
【问题描述】:

在android中,运行下面的代码sn-p时,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

虽然 Time 对象 't' 在所有条件下都具有预期值,但 toMillis() 函数返回的 long 值仅为 -1。 此外,对于 2038 年 1 月 19 日之后的所有日期上限,toMillis() 函数仅返回 -1 而不是预期值。

我不明白,也没有找到任何合适的原因或解决方案。 请让我知道,如果我做错了什么或有任何其他方法可以找到此日期之后的毫秒值。

【问题讨论】:

标签: java android time


【解决方案1】:

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

“它是仿照struct tm,实际上是用struct tm实现了大部分功能。”

所以它在后台使用C++-solution,这在 UNIX 系统上也很普遍。这种数据类型只有 32 位,所以在 2038 年会发生整数溢出。最后,您可以期待未来的错误修复,请参阅以下 Android 错误报告:

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

【讨论】:

    【解决方案2】:

    一种解决方法是使用开源第三方库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
    

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多