用Joda和时区解析约会

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

2010-10-03 18:58:072010-10-03T16:58:07.000+02:00

我用Joda用两个不同的日期格式化器解析时间戳。 最后,我希望有两个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)); 

如果有人可以帮助我,请提前感谢!

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

您可能会误解字符串表示中的时区字段。 您的时间戳2010-10-03T16:58:07.000 + 02:00意味着“在格林威治标准时间偏离+2小时的时区是16:58:07”,或者用其他措辞“它现在是16 :58:07在柏林“。我认为你认为这意味着它是格林尼治标准时间16:58:07?

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

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

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

希望你明白了。 您需要使用withZone方法调整时间以获得所需的结果。