【问题标题】:JodaTime-Passing a string directly to DateTime's constructorJodaTime-将字符串直接传递给DateTime的构造函数
【发布时间】:2012-09-10 21:04:25
【问题描述】:

我在 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 方法来获得正确的瞬间?

谢谢

【问题讨论】:

    标签: java constructor jodatime


    【解决方案1】:

    你应该调用一个 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,这是你的时区,当你不提供 DateTimeZone 而不是 UTC+1,这是你提供的字符串中的时区。

    【讨论】:

    • 我还在学习 Java,所以我仍然在为某些事情苦苦挣扎,但您的答案很明确。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多