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

时间:2016-10-09 19:30:26

标签: java android datetime unix unix-timestamp

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

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

但是,在Android上运行以下Java代码:

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

输出以下结果:

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

尝试the same online converter和其他一些带有这个Unix时间戳的网站,我从我的Android程序中获得,我得到了一整天的差异:

{{1}}

我的问题是:谁错了?在线转换器,还是Android上的Java代码?

Android / Java在这么大的数字上是否会失真?还是因为闰秒?

1 个答案:

答案 0 :(得分:2)

避免旧的日期时间类

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

古代价值观不可靠

不要在java.time(也不是旧类)中使用日期时间值来表示古代价值观,例如几个世纪前。日期时间类型在内部计算自1970年UTC第一时刻以来的秒数。在过去几个世纪中计算秒数会引发诸如Julian - 格里高利历的切换等问题。基本上这些古老的价值观毫无意义。

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

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

Instant

虽然我不建议使用历史值,但您可以将该大整数解析为InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位数字)。

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

转储到控制台。

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

secondsSinceEpoch:-46388678400 |时刻:0500-01-01T00:00:00Z

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore