我解析了时区信息附带的日期,例如: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状态。
答案 0 :(得分:4)
您提供的日期是1月份,不是在白天。因此,如果您将这些时间视为太平洋时间,则-0800偏移是正确的。
但是你没有指定America/Los_Angeles
这样的时区ID,那么为什么JodaTime会做出这样的假设呢?
答案可以在DateTimeFormatter
类的the documentation中找到:
底层打印机/解析器可以改变为完全相同的行为 使用其中一个装饰修饰符所需:
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()
的行为,请参阅these docs,这正是您所询问的。