2011-10-23 66 views
0

我認爲2011-10-23 12:00:00將保持與UTC相同,並且Converted date將是2011-10-23 17:00:00爲什麼「12:00」轉換爲UTC變爲「11:00」?

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date dt = formatter.parse("2011-10-23 12:00:00"); 
LocalDateTime ldt = new DateTime(dt).withZone(DateTimeZone.UTC).toLocalDateTime(); 
LOGGER.warn("Original date: " + ldt.toDateTime().toDate().toString()); 
DateTime cvtldt = ldt.toDateTime(DateTimeZone.forID("-05:00")); 
LOGGER.warn("Converted date: " + cvtldt.toLocalDateTime().toDateTime().toDate().toString()); 

我不明白爲什麼輸出爲負1小時?

Original date: Sun Oct 23 11:00:00 BST 2011 
Converted date: Sun Oct 23 11:00:00 BST 2011  
+1

夏令時或什麼? (狂猜) – Kos

+1

DST? ---------------- –

回答

6

您使用Date.toString()總是使用本地時區。看看你的字符串如何包含「BST」?

理想的情況下,堅持只是約達時間儘可能多的時間,你可以:

  • 解析與喬達時間格式化
  • ,除非你需要
  • 不要轉換回 Date
  • 不要使用Date.toString()如果你可以可能避免它;您無法控制其格式。

目前尚不清楚你真正想要達到什麼目標,但你幾乎肯定不想做這麼多轉換。例如,您再次調用toLocalDateTime(),然後再次調用toDateTime() - 這意味着它在使用系統默認時區後,在之前的轉換中仔細指定了UTC之後...

您的代碼包含以下轉換順序):

  • 字符串到日期
  • 日期爲DateTime
  • 日期時間爲日期時間爲UTC
  • 日期時間到LocalDateTime(*)
  • LocalDateTime爲DateTime
  • 日期時間爲日期
  • 日期爲字符串
  • (從*結果)LocalDateTime爲DateTime
  • 日期時間到LocalDateTime
  • LocalDateTime爲DateTime
  • 日期時間爲日期
  • 日期到字符串

您認爲該怎麼辦所有這些轉換的必要性和正確指定是什麼? ;)

+0

明白了!謝謝,喬恩! – zippy

+0

我需要將轉換後的日期作爲Date對象存儲在App Engine數據存儲中 - 這就是爲什麼我需要轉換回java.util.Date的唯一原因 - 這是唯一可用的數據類型。我試圖將客戶端日期(本地時區)轉換爲相當於服務器(始終是UTC)。 – zippy

+0

@zippy:對,沒關係 - 但你應該儘可能少地進行轉換。我假設你從一個字符串開始 - 在哪個時區指定的?您應該避免隱式使用默認時區的* all *轉換,IMO - 如果您要使用默認時區,則應該明確指定它。 –

0

原因發生了變化,因爲轉換到UTC是針對主機時區完成的,因此應該更改。

轉換已經改變,實際上它是訪問方法的問題。 您正在獲取基準時間,修改器存儲在其他字段中。

嘗試進入調試模式,你會看到轉換後cvtldt 有toString與修飾符。

Regards, Grzesiek