4

我解析一个带有时区信息的日期,比如:1/7/2008 11:00:00 AM -0700. -0700对应于加利福尼亚州的当前时间偏移,因为我们现在处于PDT。如果我解析它并显示它:

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z")
    .parseDateTime("1/7/2008 11:00:00 AM -0700").toString()

我得到:2008-01-07T10:00:00.000-08:00。这是“正确的”,因为10am -0800= 11 am -0700,但是我怎样才能获得返回的日期以保持Z我在输入中的相同时间偏移(部分)?

附带说明一下,使用java.text.SimpleDateFormat会给出类似的结果:new SimpleDateFormat("M/d/yyyy hh:mm:ss a Z").parse("1/7/2008 11:00:00 AM -0700").toString()returnsMon Jan 07 10:00:00 PST 2008和 PST = -0800,而我们现在处于 PDT 中。

4

1 回答 1

4

您提供的日期是 1 月,这不会是白天。因此,如果您的意思是这些时间是太平洋时间,那么 -0800 偏移量是正确的。

但是您没有指定时区 ID America/Los_Angeles,那么为什么 JodaTime 会做出这个假设呢?

答案可以在该类的文档中找到DateTimeFormatter

通过使用装饰器修饰符之一,可以将底层打印机/解析器更改为完全符合要求的行为:

withLocale(Locale)- 返回使用指定语言环境
withZone(DateTimeZone)的新格式化程序 - 返回使用指定时区
withChronology(Chronology)的新格式化程序 - 返回使用指定年表
withOffsetParsed()的新格式化程序 - 返回返回已解析时区偏移量
withPivotYear()的新格式化程序 - 返回带有指定的枢轴年份
withDefaultYear()- 返回具有指定默认年份的新格式化程序

该方法的文档DateTimeFormatter.forPattern()说:

格式可能包含特定于语言环境的输出,这会随着您更改格式化程序的语言环境而改变。调用 DateTimeFormatter.withLocale(Locale) 切换语言环境。

由于您不想使用特定的语言环境或时区,我相信您应该使用以下内容:

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z")
        .withOffsetParsed()
        .parseDateTime("1/7/2008 11:00:00 AM -0700").toString()

有关的行为,请参阅这些文档.withOffsetParsed(),这正是您要问的。

于 2013-05-10T21:40:11.470 回答