JodaTime-将字符串直接传递给DateTime的构造函数

som*_*new 3 java constructor jodatime

我正处于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"));
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Mic*_*son 6

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

new DateTime(timeString, DateTimeZone.forID("Europe/Lisbon"));
Run Code Online (Sandbox Code Playgroud)

如果你逐步完成Joda正在制作的电话,我强烈推荐你,这样你就可以了解所有部分是如何组合在一起的,你会看到调用链是:

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

因此ddateTime,当您不提供DateTimeZoneUTC + 1(这是您提供的字符串中的时区)时,这就是为什么最终成为UTC + 2,这是您的时区.