(从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 点。但是在检查一天中的时间时,上面的测试代码继续通过。即导致LocalDateTime
一天中的时间仍然是上午 10 点。
问题
为什么我的代码仍然返回 10 作为一天中的本地时间,而不管我在源字符串中不断更改其时区这一事实?
那么解析 RFC 3339 字符串(表示嵌入偏移中的瞬间)并将其转换LocalDateTime
为可能的区域调整对象的正确方法是什么?假设机器在 CE[S]T 时区运行。
环境
我需要将时间戳与计算机时间进行比较,并检查它是否不太旧。这意味着如果在欧洲评估美国时间,它可能不会“太旧”。