2009-11-18 57 views
34

爲什麼不能將它解析此:爲什麼不能DateTime.Parse解析UTC日期

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC") 
+3

IE9仍錯誤地將 「UTC」 當你使用'新的Date()toUTCString(。 )'in Javascript – 2012-07-05 10:16:10

回答

55

它無法解析該字符串,因爲「UTC」不是有效的時區指示符。

UTC時間加上一個「Z」的時間字符串的結尾表示,讓您的解析代碼應該是這樣的:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z"); 

Wikipedia article on ISO 8601

如果時間是UTC,在沒有 空間的時間之後直接添加'Z' 。 'Z'是UTC時差爲零的區域指示符 。 「09:30 UTC」是 因此表示爲「09:30Z」或 「0930Z」。 「14:45:15 UTC」將是 「14:45:15Z」或「144515Z」。

UTC時間也被稱爲'祖魯'時間, 因爲'祖魯'是北約音標 'Z'的字母表單詞。

+1

我的例子中的日期字符串來自Internet Explorer – Dve 2009-11-18 15:15:03

+0

@Dave:當你說它來自IE時,你的意思是說你從網頁中提取它?您可能需要爲提取UTC的DateTime解析器編寫自己的替代品,並用Z替換它。 – 2009-11-18 15:17:54

+0

經過對FF的測試後,我忘記了在POST後返回服務器的日期,我調用了toUTCString()方法。 FF在IE發送UTC時發送GMT。所以我不能指責IE ......這一次! – Dve 2009-11-18 16:13:27

-3

不知道爲什麼,但你可以在一個try/catch包DateTime.ToUniversalTime並獲得相同的導致更多的代碼。

祝你好運。

+0

ToUniversalTime永遠不會拋出異常 – porges 2012-03-09 02:07:45

13

你需要指定格式:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture); 
+2

不錯的建議,但如果提供的日期字符串最後不包含UTC,則會失敗。假設你傳遞了一個最後有+01的日期字符串,它會導致FormatException。取決於他想要做什麼,我想。 – 2009-11-18 15:22:50

10

或使用AdjustToUniversal的DateTimeStyle在調用

DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles) 
+0

我試過了,它似乎沒有工作 – Dve 2009-11-18 15:20:46

+4

這實際上起作用。 我用這個代碼,並從UTC字符串得到正確的UTC日期時間: DateTime.TryParseExact( 「2012-01-30T00:28:00Z」, 「YYYY-MM-DDTHH:MM:SSZ」,CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal,out timeValue)); – Roboblob 2012-01-30 00:50:52

+15

This one works too,Utc in and out,no format,no Z required:DateTime.Parse(「2013/8/3 1:02:41」,CultureInfo.InvariantCulture,DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); – crokusek 2013-10-04 02:10:26

6

這不但是一個有效的格式,「星期二,2008年00 1月1日:00:00 GMT「是。

文檔說是這樣的:

,其包括時區信息,並且符合ISO 8601例如一個字符串,第一以下兩個字符串指定協調世界時(UTC);所述第二指定時間中比UTC較早7小時的時區:

2008-11-01T19:35:00.0000000Z

包含GMT指示符和符合RFC 1123的時間格式的字符串。例如:

週六,2008年11月01日19時35分零零秒GMT

,包括隨着時區偏移信息的日期和時間的字符串。例如:

2009年3月1日5時42分零零秒-5:00

+0

在與此格式相似的日期字符串中簡單替換「UTC」和「GMT」效果很好,感謝提示。 – 2015-04-20 16:43:33

+1

雖然請注意,這將爲我返回一個'DateTime','Kind'爲'Local'。看起來像解決方法是使用[DateTimeOffset.Parse](http://stackoverflow.com/a/14774345/1028230)(然後'x.UtcDateTime'),如果你想確保你沒有脫離UTC在您的解析過程中。 – ruffin 2016-11-09 17:02:47

5

正確解析,而不改變它在這個問題給出的字符串,請使用下列內容:

using System.Globalization; 

string dateString = "Tue, 1 Jan 2008 00:00:00 UTC"; 
DateTime parsedDate = DateTime.ParseExact(dateString, "ddd, d MMM yyyy hh:mm:ss UTC", CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal); 

這實現使用一個字符串來指定正在分析的日期字符串的確切格式。DateTimeStyles參數用於指定給定的字符串是一個協調的通用時間字符串。

8

假設您爲日期時間使用格式「o」,所以您有「2016-07-24T18:47:36Z」,有一個非常簡單的方法來處理這個問題。

致電DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime()

當您撥打DateTime.Parse("2016-07-24T18:47:36Z")時會發生什麼,您將得到一個設置爲當地時區的DateTime。所以它將它轉換爲當地時間。

ToUniversalTime()將其更改爲UTC DateTime並將其轉換回UTC時間。

+0

我一直在我的頭上打了幾個小時在這個...... thx! – Corelgott 2017-11-09 11:31:49

1

只需使用:

var myDateUtc = DateTime.SpecifyKind(DateTime.Parse("Tue, 1 Jan 2008 00:00:00"), DateTimeKind.Utc); 

if (myDateUtc.Kind == DateTimeKind.Utc) 
{ 
    Console.WriteLine("Yes. I am UTC!"); 
} 

您可以使用在線C#編譯器測試此代碼:

http://rextester.com/

我希望它能幫助。

0

只需更換 「UTC」 與 「GMT」 - 簡單,不破壞正確格式的日期:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT")) 
相關問題