一,问题描述
通过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