Cannot parse "1986-05-04": Illegal instant due to time zone offset transition (Asia/Shanghai)
阅读原文时间:2023年07月08日阅读:1

调查系统错误时,发现了一个很奇怪的现象,出生日期1986-05-04号的用户始终无法注册。发现后台使用使用jodatime的代码demo如下:

public static DateTime parseDatetime(String time, String format) {
DateTimeFormatter formatter = DateTimeFormat.forPattern(format);
return formatter.parseDateTime(time);
}

后台抛出了异常:

Exception in thread "main" org.joda.time.IllegalInstantException: Cannot parse "1986-05-04": Illegal instant due to time zone offset transition (Asia/Shanghai)
at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:390)
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:854)
at cn.com.lawson.web.T.parseDatetime(T.java:14)
at cn.com.lawson.web.T.main(T.java:9)

感觉非常的疑惑,怎么这个日期会有问题呢?于是百度后:http://www.bubuko.com/infodetail-997580.html 在这个页面上找到的原因,原来是夏令,冬令的日期导致的

详情可以可以打开网页研究研究。

解决办法:

1、使用UTC时间

public static DateTime parseDatetime(String time, String format) {  
    DateTimeFormatter formatter = DateTimeFormat.forPattern(format).withZoneUTC();  
    return formatter.parseDateTime(time);  
}

2、使用本地时区转换

public static LocalDateTime parseDatetime(String time, String format) {
DateTimeFormatter formatter = DateTimeFormat.forPattern(format);
return formatter.parseLocalDateTime(time);
}