2009-11-18 61 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"))