(从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 时间如何调整时区。但结果却大错特错!
我尝试反复更改输入字符串中的时区,因此测试失败。例如,如果我将字符串更改为,2019-08-28T10:39:57+08:00则表示现在是巴黎凌晨 2 点。但在检查一天中的小时时,上述测试代码继续通过。即结果中的LocalDateTime时间仍然是上午 10 点。
问题
为什么我的代码仍然返回 10 作为当地时间,尽管我不断更改源字符串中的时区?
那么解析 RFC 3339 字符串(表示嵌入偏移中的瞬间)并将其转换为LocalDateTime可能的区域调整对象的正确方法是什么?假设机器在 CE[S]T 时区运行。
环境
我需要将时间戳与计算机时间进行比较,并检查它是否太旧。这意味着如果在欧洲评估美国时间,它可能不会“太旧”。
元芳怎么了
慕的地10843
相关分类