如何从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器每个字符代表什么。