所以我有一个尊重你的时区的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();
}
1995 年 1 月 1 日在 Kiritimati 中不存在吗?他们如何参考落入该差距的时间?
目前,当我遇到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