Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个日历失败了?_Java_Date_Calendar - Fatal编程技术网

Java 为什么这个日历失败了?

Java 为什么这个日历失败了?,java,date,calendar,Java,Date,Calendar,所以我有一个Java应用程序尊重你的时区,我注意到一些时区有无效的日期 我正在使用SimpleDataFormatter('yyyyymmdd')进行解析。。。并发现它在某些时区日期组合上出现ParseException时失败 我查看了内部,它似乎失败了,因为Calendar类抛出了IllegalArgumentException 我使用的是setLenient(false),因为我不想让解析做出假设。使用setLenient(true)的默认设置假定缺少字段,并且不会抛出IllegalArgu

所以我有一个Java应用程序尊重你的时区,我注意到一些时区有无效的日期

我正在使用
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日出生的。。。我搬到了基里巴斯。。。我的生日已经不存在了。。。现在,我只是想用我提到的默认时区来解决这个问题。。。有没有更好的办法来解决这一冲突?(也许我应该假设最接近的解释?)也许打开宽大会更好?