jodaTime踩坑:Illegal instant due to time zone offset transition (Asia/Shanghai)

一,问题描述

通过DateTime获取某年某月某日的时间戳,然后使用joda-time的Period.getYears()比较两个时间相差的年数。当new DateTime(“1990-04-15”)报错如下:

Exception in thread "main" org.joda.time.IllegalInstantException: Cannot parse "1990-04-15": Illegal instant due to time zone offset transition (Asia/Shanghai)
	at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:471)
	at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:182)
	at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826)
	at org.joda.time.convert.StringConverter.getInstantMillis(StringConverter.java:65)
	at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:173)
	at org.joda.time.DateTime.<init>(DateTime.java:257)
	at utils.Encrypt.main(Encrypt.java:184)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

通过遍历1900-2500年所有时间发现并不是所有时间都会报错,只有1940-06-03、1941-03-16、1986-05-04、1987-04-12、1988-04-10、1989-04-16、1990-04-15、1991-04-14几个时间会有如上错误抛出。

二,原因

new DateTime(“1990-04-15”)时未指定时区,导致无法找到该时间对应的时间戳。

三,解决方案

new DateTime(“1990-04-15”)时指定时区,如:new DateTime(“1990-04-15”, DateTimeZone.forID("+08:00"))

转载自https://blog.csdn.net/u010954806/article/details/79064130

猜你喜欢

转载自blog.csdn.net/u013039395/article/details/86632108
今日推荐