gpt4 book ai didi

java - 为什么这个日历会失败?

转载 作者:搜寻专家 更新时间:2023-11-01 03:39:22 26 4
gpt4 key购买 nike

所以我有一个尊重你的时区的 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();
}

虽然这个在 Pacific/Kiritimati 失败了:

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

最佳答案

这是因为 Kirimati 在 1 月 1 日遭遇了 24 小时轮类。 位于中太平洋的基里巴斯共和国于 1995 年 1 月 1 日引入了东半部的日期更改,从时区 UTC−11 和 UTC−10 更改为 UTC+13 和 UTC+14。在此之前,该国被 IDL split 。更改后,IDL 实际上向东移动以绕过该国家/地区。
http://en.wikipedia.org/wiki/International_Date_Line#Eastern_Kiribati .

此外,我查看了 Apia,似乎:在 2011 年 12 月 30 日本地时间 0000,时钟提前了 24 小时 http://en.wikipedia.org/wiki/Apia .

显然,由于 24 小时轮类,这两个日期实际上并不存在于各自时区的日历中。这可能对所有其他人都是正确的。

关于java - 为什么这个日历会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com