【发布时间】:2025-12-10 13:15:01
【问题描述】:
所以我有一个尊重您的时区的 Java 应用程序,我注意到一些时区的日期无效...
我正在使用SimpleDateFormatter('yyyyMMdd') 进行解析...并发现它在某些时区日期组合中以ParseException 失败。
我查看了内部结构,看起来它失败了,因为 Calendar 类正在抛出 IllegalArgumentException。
我正在使用setLenient(false),因为我不希望解析做出假设。默认使用setLenient(true) 假定缺少字段并且不会抛出IllegalArgumentException。
为什么这个有效:
public void testCalendarPass() {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setLenient(false);
cal.set(Calendar.YEAR, 1995);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH,1);
//This call will pass
cal.getTime();
}
虽然太平洋/基里蒂马蒂的这个失败了:
public void testCalendarFailure() {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTimeZone(TimeZone.getTimeZone("Pacific/Kiritimati"));
cal.setLenient(false);
cal.set(Calendar.YEAR, 1995);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH,1);
//This call will fail
cal.getTime();
}
Kiritimati 不存在 1995 年 1 月 1 日吗?他们如何参考该差距内的时间?
目前,当我遇到ParseException 时,我默认使用服务器的时区进行解析。但这会引入长达 24 小时的偏移量(取决于时区)。
以下是在其他时区失败的其他日期列表:
19930820 FAILS on Kwajalein
19930820 FAILS on Pacific/Kwajalein
20111230 FAILS on MIT
20111230 FAILS on Pacific/Apia
19950101 FAILS on Pacific/Enderbury
20111230 FAILS on Pacific/Fakaofo
19950101 FAILS on Pacific/Kiritimati
【问题讨论】: