2013-05-09 27 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()的行爲,這是你是什麼詢問。