2010-09-09 176 views
2

我有一個日期時間作爲一個字符串,例如。 「2010-08-02」,我試圖把它與下面的代碼段解析日期時間

DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture) 

當我打印到控制檯,我得到以下轉換爲UTC:8/1/2010 5:00: 00 PM。 日期顯示爲我試圖解析日期之前的日期是否有原因?我可以在這一天添加一天來推進到原來的一天,但我想看看是否有任何我在做這個造成的格式錯誤。

回答

0

如果原始字符串就是其格式爲「2010-08-02」(不帶Z)的日期,那麼爲什麼不乾脆:

DateTime.SpecifyKind(
    DateTime.ParseExact("2010-08-02", 
     "yyyy-MM-dd", 
     CultureInfo.InvariantCulture), 
     DateTimeKind.Utc); 

ParseExact大概會返回一個DateTime與類=不明,並且您可以使用SpecifyKind將其設置爲UTC或Local。

3

編輯:我的是正確的混合物,而不是:)

它是顯示您的UTC字符串表示的本地時間。令人煩惱的是,DateTime並沒有明確這樣的事情,IMO。另外,我不認爲你想用'Z'作爲時區的格式說明符;這實際上並不是有效的格式說明符;它應該是'z',但是這意味着像「+01:00」這樣的東西。我認爲你應該使用'K'。坦率地說,目前尚不清楚,但如果使用'K',它會正確地往返,(當然,'Z'往返,但僅僅是因爲它忽略了它,將其視爲純文本)。

您可以通過只調用ToUniversalTime,或(首選IMO)規定DateTimeStyles.AdjustToUniversal作爲一個額外的參數修正:

DateTime dt = DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddK", 
            CultureInfo.InvariantCulture, 
            DateTimeStyles.AdjustToUniversal); 
+0

Z表示祖魯時間(格林威治標準時間0),這意味着如果您的時區低於祖魯時間,那麼差值的小時數會從該日期減少,並將我們帶回到前一天的特定時間...樂趣!例如,星期五在東京,星期五晚上還是在洛杉磯的星期四晚上,所以它可能是在德里的早上很早的時候,當時它仍然是在倫敦附近的卡蒂薩克的週四;)。 – 2010-09-09 16:46:41

1

午夜爲2010-08-02 UTC恰好是下午5點在2010- 08-01。