解析日期时如何保留时区?

时间:2013-05-09 00:39:53

标签: java jodatime datetimeoffset

我解析了时区信息附带的日期,例如: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()返回Mon Jan 07 10:00:00 PST 2008,PST = -0800,而我们现在处于PDT状态。

1 个答案:

答案 0 :(得分:4)

您提供的日期是1月份,是在白天。因此,如果您将这些时间视为太平洋时间,则-0800偏移是正确的。

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

答案可以在DateTimeFormatter类的the documentation中找到:

  

底层打印机/解析器可以改变为完全相同的行为   使用其中一个装饰修饰符所需:

     

withLocale(Locale) - 返回一个使用指定语言环境的新格式化程序   withZone(DateTimeZone) - 返回使用指定时区的新格式化程序   withChronology(Chronology) - 返回使用指定时间顺序的新格式化程序   withOffsetParsed() - 返回一个新的格式化程序,返回解析的时区偏移量
  withPivotYear() - 返回具有指定透视年份的新格式化程序   withDefaultYear() - 返回具有指定默认年份的新格式化程序

DateTimeFormatter.forPattern()方法的

The documentation表示:

  

格式可能包含特定于语言环境的输出,当您更改格式化程序的语言环境时,这将更改。调用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()的行为,请参阅these docs,这正是您所询问的。