使用 Joda 解析具有时区的日期

2022-09-04 03:38:04

我有两个时间戳,它们以两种不同的格式描述相同的时刻。

2010-10-03 18:58:07和。2010-10-03T16:58:07.000+02:00

我用Joda-Time用两个不同的日期格式化程序解析时间戳。最后,我希望有两个 DateTime 对象,它们在相同的时间时刻方面是相等的。

DateFormatter提供了几种方法来控制时区和区域设置,但我无法让它工作。

这是我想工作的代码:

    final String date1 = "2010-10-03 18:58:07"; // Europe/Berlin local time
    final DateTimeFormatter formatter1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    final DateTime dateTime1 = formatter1.parseDateTime(date1);

    final String date2 = "2010-10-03T16:58:07.000+02:00"; // Europe/Berlin local time with time zone
    final DateTimeFormatter formatter2 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    final DateTime dateTime2 = formatter2.parseDateTime(date2);

    Assert.assertTrue(dateTime1.isEqual(dateTime2));

答案 1

如果您的默认时间 zome 是欧洲/柏林,则 2010-10-03 18:58:07 对应于 2010-10-03T16:58:07.000+00:00。

您可能误解了字符串表示形式的时区字段。您的时间戳 2010-10-03T16:58:07.000+02:00 表示“在与 GMT 偏移 +2 小时的时区中,它是 16:58:07”),或者使用其他措辞“在柏林现在是 16:58:07”。我假设你期望它意味着它是16:58:07 GMT?


答案 2

你的两个时间戳并不代表同一时刻(正如 jambjo 已经说过的那样)。在维基百科上查看时区作为UTC的偏移量

另请参阅 parseDateTime 文档,了解它的工作原理。如果您未提供任何时区,则将应用默认时区(如果您在那里,则为柏林时区 UTC+2)。所以:

  • 2010-10-03 18:58:07变为(柏林为 18:58,与 UTC 相差 2 小时,这意味着 UTC 为 16:58)。如预期的那样。2010-10-03T18:58:07.000+02:00
  • 2010-10-03T16:58:07.000+02:00保持原样,因为提供了一个时区(即柏林的16:58,与UTC的偏移量为2小时,这意味着UTC中的14:58)

希望你有这个想法。您需要使用 withZone 方法调整时间以获得所需的结果。