【发布时间】:2015-12-29 04:23:41
【问题描述】:
在 200 年左右将 Dates 转换为 LocalDates 时,我得到不一致的结果。使用以下代码进行转换:
private LocalDate toLocalDate(Date localDate)
{
return LocalDateTime.ofInstant(localDate.toInstant(), ZoneId.systemDefault()).toLocalDate();
}
我的ZoneId.systemDefault() 是Africa/Harare,与测试中使用的CAT 匹配。我运行的测试用例是
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
String dateString = "Tue Jan 01 00:00:00 CAT 200";
String dateString2 = "Tue Jan 01 00:00:00 CAT 201";
String dateString3 = "Wed Dec 31 00:00:00 CAT 200";
System.out.println(toLocalDate(simpleDateFormat.parse(dateString)));
System.out.println(toLocalDate(simpleDateFormat.parse(dateString2)));
System.out.println(toLocalDate(simpleDateFormat.parse(dateString3)));
我对此的预期输出是
0200-01-01
0201-01-01
0200-12-31
或者,如果不是这样,至少始终不正确的值。实际结果是
0199-12-31
0201-01-01
0200-12-31
所以似乎第一个正在略微回滚,可能是与CAT 时区对应的两个小时?但是为什么这只发生在一个案例上呢?用 2000 年做同样的实验不会产生同样的错误。
【问题讨论】:
-
附注 - 使用
localDate的名称作为Date类型的变量是相当混乱的,因为LocalDate类型的存在具有非常不同的含义。 -
如果不出意外,日期名称就被破坏了 - 如果 200 年 12 月 31 日是星期三,那么 201 年 1 月 1 日怎么会是星期二?
-
@Puce 你意识到时区的概念在公元 200 年并不存在。
-
请注意,CAT 不与 Africa/Harare - CAT 被视为“UTC+2”,而 Africa/Harare 的偏移量为 +02:10 :20 那时。
-
是的,应该。基本上据我所知,这里有 三个 不好的地方 - 日期名称、CAT == Africa/Harare 的假设以及 Java 8 错误。我正在尝试将其隔离为 just 错误,届时我将发布答案。
标签: java date java-8 java-time