我有一個日期時間作爲一個字符串,例如。 「2010-08-02」,我試圖把它與下面的代碼段解析日期時間
DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture)
當我打印到控制檯,我得到以下轉換爲UTC:8/1/2010 5:00: 00 PM。 日期顯示爲我試圖解析日期之前的日期是否有原因?我可以在這一天添加一天來推進到原來的一天,但我想看看是否有任何我在做這個造成的格式錯誤。
我有一個日期時間作爲一個字符串,例如。 「2010-08-02」,我試圖把它與下面的代碼段解析日期時間
DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture)
當我打印到控制檯,我得到以下轉換爲UTC:8/1/2010 5:00: 00 PM。 日期顯示爲我試圖解析日期之前的日期是否有原因?我可以在這一天添加一天來推進到原來的一天,但我想看看是否有任何我在做這個造成的格式錯誤。
如果原始字符串就是其格式爲「2010-08-02」(不帶Z)的日期,那麼爲什麼不乾脆:
DateTime.SpecifyKind(
DateTime.ParseExact("2010-08-02",
"yyyy-MM-dd",
CultureInfo.InvariantCulture),
DateTimeKind.Utc);
ParseExact大概會返回一個DateTime與類=不明,並且您可以使用SpecifyKind將其設置爲UTC或Local。
編輯:我的是正確的混合物,而不是:)
它是顯示您的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);
午夜爲2010-08-02 UTC恰好是下午5點在2010- 08-01。
Z表示祖魯時間(格林威治標準時間0),這意味着如果您的時區低於祖魯時間,那麼差值的小時數會從該日期減少,並將我們帶回到前一天的特定時間...樂趣!例如,星期五在東京,星期五晚上還是在洛杉磯的星期四晚上,所以它可能是在德里的早上很早的時候,當時它仍然是在倫敦附近的卡蒂薩克的週四;)。 – 2010-09-09 16:46:41