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

标签 java android time

在 android 中,当运行下面的代码 fragment 时,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 (android class) 的 year-2038-problem。该问题在 UNIX 中很典型。该类的文档说:

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

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

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

关于java - 为什么 toMillis() 函数在 Java 中返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22730915/

相关文章:

java - 使用 Java 从 Google Drive 获取列表文件

ruby-on-rails - Rails 中何时应使用 `DateTime.now.utc` 与 `Time.current.utc`?

java - 函数执行时等待加载消息

java - 如何更改 JSeparator 的颜色?

java - 如何在 Windows 中设置 ESC/Java2 环境并使用 ESC/Java2 构建/运行?

java - Android Studio 逻辑错误

java - 尝试获取 appDataFolder 中的文件列表时出现 GoogleAuthIOException

php - 在提供错误信息的事件之间生成时间

ios - 如何在swift中延迟for循环迭代

java - 什么是NullPointerException,我该如何解决?