首页 文章

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

提问于
浏览
-1

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

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

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

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

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

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

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

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

1 回答

  • 2

    避免旧的日期时间类

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

    古代 Value 观不可靠

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

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

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

    瞬发

    虽然我不建议使用历史值来执行此操作,但您可以将该大整数解析为 Instant . Instant类表示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.Calendarjava.text.SimpleDateFormat .

    现在位于maintenance modeJoda-Time项目建议迁移到java.time .

    要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 .

    从哪里获取java.time类?

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

相关问题