【发布时间】:2020-01-01 13:27:44
【问题描述】:
(从CodeReview迁移而来)
我正在试验并试图更好地理解 Java Time。我的代码没有按预期工作,我想问一下原因,可能是因为我对 JSR-310 时区处理存在误解。
我有一个时间戳字符串可以用DateTimeFormatter解析
String text = "2019-08-28T10:39:57+02:00";
DateTimeFormatter ISO_RFC_3339_PARSER = DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.of("Europe/Paris"));
当服务器的本地时间是中欧上午 10:39 时,会生成上述值。由于夏令时区,UTC 时间是早上 8:39。您可以自己算一下,找出您所在区域的时间。
当计算机的时区与时间戳(+2)中显示的时区相同时,以下测试有效
@Test
public void testTimestamp()
{
LocalDateTime time = ZonedDateTime.from(ISO_RFC_3339_PARSER.parse(text)).toLocalDateTime();
errorCollector.checkThat(time.getYear(), is(2019));
errorCollector.checkThat(time.getMonthValue(), is(8));
errorCollector.checkThat(time.getDayOfMonth(), is(28));
errorCollector.checkThat(time.getHour(), is(10));
errorCollector.checkThat(time.getMinute(), is(39));
errorCollector.checkThat(time.getSecond(), is(57));
}
我已尝试修补 输入字符串,以更好地了解 Java Time 如何调整时区。但结果出乎意料地错误!
我尝试反复更改输入字符串中的时区,以使测试失败。例如,如果我将字符串更改为2019-08-28T10:39:57+08:00,则表示现在是巴黎凌晨 2 点。但是在检查一天中的时间时,上面的测试代码继续通过。 IE。在生成的LocalDateTime 中,一天中的时间仍然是上午 10 点。
问题
为什么我的代码仍然返回 10 作为一天中的 local 时间,而不管我在源字符串中不断更改其时区这一事实?
那么,关于可能的区域调整,解析 RFC 3339 字符串(表示嵌入偏移中的瞬间)并将其转换为 LocalDateTime 对象的正确方法是什么?假设机器在 CE[S]T 时区运行。
环境
我需要将时间戳与计算机时间进行比较,并检查它是否太旧。这意味着如果在欧洲评估美国时间,它可能不会“太旧”。
【问题讨论】:
标签: java datetime datetime-parsing jsr310 rfc3339