Android 上大数字的 Unix 时间戳转换精度

Unix timestamp conversion accuracy for big numbers on Android

我正在测试 the list on this site 中的以下值:

常规日期:500,1 月 1 日 = Unix 时间戳:-46388678400

但是,运行 Java 上的 Android 代码:

GregorianCalendar calendar = new GregorianCalendar(500, 0, 1, 0, 0, 0);
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
Log.d("timestamp", String.valueOf(calendar.getTimeInMillis() / 1000L));
Log.d("date", String.valueOf(calendar.getTime()));

输出如下结果:

-46388592000
Sat Jan 01 02:00:00 GMT+02:00 500

尝试使用 the same online converter 和其他一些具有我从 Android 程序获得的 Unix 时间戳的站点,我得到了一整天的差异:

Android app:  -46388592000 = Sat Jan 01 00:00:00 GMT
Online sites: -46388592000 = Sat Jan 02 00:00:00 GMT

我的问题是:谁错了?在线转换器,或 Android?

上的 Java 代码

Android/Java 如此大的数字是否会降低准确性?还是因为闰秒?

避免使用旧日期时间 类

您正在使用麻烦的旧日期时间 类,现在是遗留的。避开他们。由 java.time 类.

补充

古老的价值观不可靠

不要将 java.time(也不是旧的 类)中的日期时间值用于古代值,例如几个世纪前。日期时间类型在内部计算自 1970 UTC 第一时刻以来的秒数。在过去的许多世纪中计算秒数会引发诸如 Julian- 公历切换之类的问题。基本上这样的古老价值观是没有意义的。

如果您想表示历史记录中的日期,请改用 LocalDate

LocalDate columbusAttacksAmerica = LocalDate.of( "1492-10-12" );

Instant

虽然我不建议使用历史值这样做,但您可以将该大整数解析为 InstantInstant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

long secondsSinceEpoch = -46_388_678_400L;
Instant instant = Instant.ofEpochSecond ( secondsSinceEpoch );

转储到控制台。

System.out.println ( "secondsSinceEpoch: " + secondsSinceEpoch + " | instant: " + instant );

secondsSinceEpoch: -46388678400 | instant: 0500-01-01T00:00:00Z

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old date-time classes such as java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Joda-Time project, now in maintenance mode,建议迁移到java.time。

要了解更多信息,请参阅 Oracle Tutorial。并在 Stack Overflow 中搜索许多示例和解释。

在哪里获取java.time类?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP项目专门为Android改编了ThreeTen-Backport(上面提到的)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.