2014-07-12 42 views
2

簡單的問題,我有這個字符串:解析一個UTC日期字符串到日期在C#

string dateString = "7/12/2014 4:42:00 PM"; 

這是一個日期字符串,它是在UTC時區。

我需要將其轉換爲日期,所以我做了以下內容:

DateTimeOffset dateOffset; 

DateTimeOffset.TryParse(dateString, out dateOffset); 

DateTime date = dateOffset.UtcDateTime; 

問題:

當我解析字符串到日期,代碼考慮dateString位於PC的本地時區(+3 GMT),而不是UTC時區。

所以我正在以下的dateOffset = {7/12/2014 4:42:00 PM +03:00}從而date = {7/12/2014 1:42:00 PM}

我怎麼能告訴他,所提供的日期字符串在UTC格式,而不是在本地時區格式?

感謝

回答

4

我怎麼能告訴他,所提供的日期字符串在UTC格式,而不是在本地時區格式?

在呼叫中指定AssumeUniversal的值DateTimeStyles。這告訴解析代碼要做什麼。例如:

// null here means the thread's current culture - adjust it accordingly. 
if (DateTimeOffset.TryParse(dateString, null, DateTimeStyles.AssumeUniversal, 
          out dateOffset)) 
{ 
    // Valid 
} 

您應該總是使用TryParse的結果來判斷它是否被成功解析。

如果你知道格式和具體的文化,我會親自使用DateTimeOffset.TryParseExact。 (嗯,說實話,我會用我的Noda Time項目下手,但是這是一個不同的問題。)

+1

哇,偉大的Jon Skeet回答我的問題。這是一個桶列表條目完成!時間集中在我的下一個條目上:「繞月球飛行」。感謝:D – Youssef

2

還有就是DateTimeOffset.TryParse

DateTimeOffset.TryParse Method (String, IFormatProvider, DateTimeStyles, DateTimeOffset) 

,它允許你指定DateTimeStyles另一個重載。其中DateTimeStyles的是AssumeUniversal,這就是你要找的東西:

如果解析字符串中指定任何時區,該字符串是 假定來表示UTC。此值不能與AssumeLocal或 RoundtripKind一起使用。

1

不知道API的淨提供,但我想你大概可以使用ISO8601格式解析之前表示UTC時區,即首先轉換7/12/2014 4:42:00 PM弄成2014-07-02T16:42:00Z,然後使用嘗試使用的DateTimeOffset

解析