如何从ISO 8601格式创build.NET DateTime

我已经find了如何将date时间转换为ISO 8601格式,但没有关于如何在C#中做相反的事情。

我有2010-08-20T15:00:00Z ,我想把它变成一个DateTime对象。

我可以自己把琴弦的各个部分分开,但对于那些已经是国际标准的东西来说,这似乎有很多工作要做。

此解决scheme使用DateTimeStyles枚举,并且它也适用于Z.

 DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind); 

这完美地打印解决scheme。

 using System.Globalization; DateTime d; DateTime.TryParseExact( "2010-08-20T15:00:00", "s", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out d); 

尽pipeMSDN认为“s”和“o”格式反映了标准,但他们似乎只能parsing它的一个有限的子集。 特别是如果string包含时区指定,则会出现问题。 (既不是基本的ISO8601格式,也不是降低精度格式 – 但这不完全是你的情况。)这就是为什么我使用自定义格式string来parsingISO8601。 目前我最喜欢的片段是:

 static readonly string[] formats = { // Basic formats "yyyyMMddTHHmmsszzz", "yyyyMMddTHHmmsszz", "yyyyMMddTHHmmssZ", // Extended formats "yyyy-MM-ddTHH:mm:sszzz", "yyyy-MM-ddTHH:mm:sszz", "yyyy-MM-ddTHH:mm:ssZ", // All of the above with reduced accuracy "yyyyMMddTHHmmzzz", "yyyyMMddTHHmmzz", "yyyyMMddTHHmmZ", "yyyy-MM-ddTHH:mmzzz", "yyyy-MM-ddTHH:mmzz", "yyyy-MM-ddTHH:mmZ", // Accuracy reduced to hours "yyyyMMddTHHzzz", "yyyyMMddTHHzz", "yyyyMMddTHHZ", "yyyy-MM-ddTHHzzz", "yyyy-MM-ddTHHzz", "yyyy-MM-ddTHHZ" }; public static DateTime ParseISO8601String ( string str ) { return DateTime.ParseExact ( str, formats, CultureInfo.InvariantCulture, DateTimeStyles.None ); } 

如果你不介意parsing无TZstring(我这样做),你可以添加一个“S”行来大大扩展覆盖的格式变化的数量。

这里是一个更好的工作( LINQPad版本):

 DateTime d; DateTime.TryParseExact( "2010-08-20T15:00:00Z", @"yyyy-MM-dd\THH:mm:ss\Z", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out d); d.ToString() 

产生

 true 8/20/2010 8:00:00 AM 

TryParseExact的ISOstring的格式完全匹配起来似乎很重要。 我猜Exact是精确的,这个答案对大多数人来说都是显而易见的,但无论如何…

在我的情况下,Reb.Cabin的答案不起作用,因为我有一个稍微不同的input作为我的“价值”下面。

价值: 2012-08-10T14:00:00.000Z

那里有一些额外的000毫秒毫秒,可能还有更多。

但是,如果我添加一些.fff格式如下所示,一切都很好。

格式string: @"yyyy-MM-dd\THH:mm:ss.fff\Z"

在VS2010立即窗口:

 DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d); 

真正

您可能不得不使用DateTimeStyles.AssumeLocal以及您的时间是什么区域…

这在LINQPad4中正常工作:

 Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z")); Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00")); Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00")); 

DateTime.ParseExact(...)允许您告诉parsing器每个字符代表什么。