Java 为什么这个日历失败了?
所以我有一个Java应用程序尊重你的时区,我注意到一些时区有无效的日期 我正在使用Java 为什么这个日历失败了?,java,date,calendar,Java,Date,Calendar,所以我有一个Java应用程序尊重你的时区,我注意到一些时区有无效的日期 我正在使用SimpleDataFormatter('yyyyymmdd')进行解析。。。并发现它在某些时区日期组合上出现ParseException时失败 我查看了内部,它似乎失败了,因为Calendar类抛出了IllegalArgumentException 我使用的是setLenient(false),因为我不想让解析做出假设。使用setLenient(true)的默认设置假定缺少字段,并且不会抛出IllegalArgu
SimpleDataFormatter('yyyyymmdd')
进行解析。。。并发现它在某些时区日期组合上出现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日吗?它们是如何引用该间隙内的时间的
现在,当我遇到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
编辑:我最初以为Java不认识“Pacific/Kiritimati”的含义,但事实证明它认识。要获取Java将识别的所有字符串的列表,请使用:
Set<String> ids = new TreeSet<String>();
for (String id : TimeZone.getAvailableIDs())
ids.add(id);
for (String id : ids)
System.out.println(id);
Set id=new TreeSet();
for(字符串id:TimeZone.getAvailableIDs())
添加(id);
用于(字符串id:ids)
系统输出打印项次(id);
这是因为基里马蒂号在1月1日上了24小时的班<代码>位于中太平洋的基里巴斯共和国于1995年1月1日将其东半部的日期从UTC时区改为UTC−11和UTC−10至UTC+13和UTC+14。在此之前,该国被IDL瓜分。改变后,IDL实际上向东移动,在全国范围内运行。
另外,我看了看Apia,似乎:在2011年12月30日当地时间0000时,时钟提前了24小时
显然,由于24小时轮班,这两个日期实际上不存在于各自时区的日历中。对其他所有人来说可能都是这样。这太疯狂了!所以当时区改变时,人们通常不会改变他们的出生日期。。。所以如果我是1995年1月1日出生的。。。我搬到了基里巴斯。。。我的生日已经不存在了。。。现在,我只是想用我提到的默认时区来解决这个问题。。。有没有更好的办法来解决这一冲突?(也许我应该假设最接近的解释?)也许打开宽大会更好?