3

我在 CEST 时区 (+2),我在理解 JodaTime 如何存储 DateTime 时遇到了一些困难。拿这个代码:

String timeString = "2012-09-10T13:30:00+01:00";
DateTime ddateTime = new DateTime(timeString);
DateTime dtLisbon = ddateTime.withZone(DateTimeZone.forID("Europe/Lisbon"));

运行后,变量得到以下值:

timeString = '2012-09-10T13:30:00+01:00'
ddateTime = '2012-09-10T14:30:00.000+02:00'
dtLisbon = '2012-09-10T13:30:00.000+01:00'

为什么 JodaTime 不将 ddateTime 设置为我发送的确切字符串?我是否总是需要调用 .withZone 方法来获得正确的瞬间?

谢谢

4

1 回答 1

6

你应该调用一个像这样的DateTime构造函数:DateTimeZone

new DateTime(timeString, DateTimeZone.forID("Europe/Lisbon"));

如果您逐步了解 Joda 正在拨打的电话,我强烈建议您这样做,这样您就可以了解所有部分是如何组合在一起的,您会看到调用链是这样的:

DateTime(Object)
  -> BaseDateTime(Object, Chronology)
    -> AbstractConverter.getChronology(Object, Chronology)
      -> DateTimeUtils.getChronology(Chronology)
        -> ISOChronology.getInstance()
          -> DateTimeZone.getDefault()
            -> System.getProperty("user.timezone")

所以这就是为什么ddateTime最终是 UTC+2,这是你的时区,当你不提供 aDateTimeZone而不是 UTC+1,这是你提供的字符串中的时区。

于 2012-09-10T23:37:42.080 回答