2013-05-09 26 views
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()返回Mon Jan 07 10:00:00 PST 2008和PST = -0800,而我们现在在PDT。

回答

4

您提供的日期是一月份,而不是已在白天时间。所以-0800偏移是正确的,如果你的意思是这些时间在太平洋时间。

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

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

底层的打印机/分析器可以改变的行为通过使用装饰修饰符之一正是因为 要求:

withLocale(Locale) - 返回使用指定区域的新格式化程序
withZone(DateTimeZone) - 返回使用指定时区的新格式化程序
withChronology(Chronology) - r eturns使用指定的年表
withOffsetParsed()一个新的格式化 - 返回一个新的格式化程序返回的分析时区偏移
withPivotYear() - 返回一个新的格式与指定的支点年
withDefaultYear() - 返回一个新的格式与指定的默认年

The documentationDateTimeFormatter.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() 

these docs.withOffsetParsed()的行为,这是你是什么询问。