我正在测试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 回答
避免旧的日期时间类
您正在使用麻烦的旧日期时间类,现在是遗留的 . 避免他们 . 由java.time类取代 .
古代 Value 观不可靠
不要在java.time(也不是旧类)中使用日期时间值来表示几个世纪以前的古代 Value 观 . 日期时间类型在内部计算自1970年UTC第一时刻以来的秒数 . 在过去的几个世纪中计算秒数会引发诸如Julian -Gregorian日历切换等问题 . 基本上这些古老的 Value 观毫无意义 .
如果要表示历史记录中的日期,请使用
LocalDate
.瞬发
虽然我不建议使用历史值来执行此操作,但您可以将该大整数解析为
Instant
. Instant类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分的最多九(9)位数字) .转储到控制台 .
关于java.time
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧日期时间类,例如java.util.Date,.Calendar和java.text.SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到java.time .
要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 .
从哪里获取java.time类?
Java SE 8和SE 9以及之后
内置 .
具有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和SE 7
大部分java.time功能在ThreeTen-Backport中反向移植到Java 6和7 .
Android
ThreeTenABP项目专门针对Android调整 ThreeTen-Backport (如上所述) .
见How to use… .
ThreeTen-Extra项目使用其他类扩展了java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .