我已经找到了如何将 DateTime 转换为 ISO 8601格式,但是没有关于如何在 C # 中进行相反操作的内容。
我有 2010-08-20T15:00:00Z,我想把它变成一个 DateTime对象。
2010-08-20T15:00:00Z
DateTime
我可以自己分离绳子的各个部分,但是对于一个已经是国际标准的东西来说,这似乎是一个很大的工作量。
DateTime.ParseExact(...)允许您告诉解析器每个字符表示什么。
DateTime.ParseExact(...)
此解决方案使用 日期时间样式枚举,并且它还可以与 Z 一起使用。
DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
这个可以完美地打印出溶液。
using System.Globalization; DateTime d; DateTime.TryParseExact( "2010-08-20T15:00:00", "s", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out d);
这里有一个更适合我的(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能够正常工作,与 ISO 字符串的格式完全匹配似乎很重要。我想精确就是精确,这个答案对大多数人来说是显而易见的,但无论如何..。
TryParseExact
在我的情况下,Reb. Cabin 的答案不起作用,因为我的输入与下面的“值”略有不同。
价值: 2012-08-10T14:00:00.000Z
2012-08-10T14:00:00.000Z
有一些额外的000毫秒在那里,可能还有更多。
但是,如果我添加一些 .fff的格式如下所示,一切都很好。
.fff
格式字符串: @"yyyy-MM-dd\THH:mm:ss.fff\Z"
@"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以及取决于什么区域您的时间是为..。
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"));
虽然 MSDN 说“ s”和“ o”格式反映了标准,但是它们似乎只能解析标准的有限子集。特别是如果字符串包含时区规范,这是一个问题。(不管是基本的 ISO8601格式,还是精度降低的格式,它都不适用——然而,这并不完全是你的情况。)这就是为什么我在解析 ISO8601时使用自定义格式字符串的原因。目前我首选的片段是:
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 ); }
如果您不介意解析 TZ-less 字符串(我介意) ,那么可以添加一个“ s”行来大大扩展所覆盖的格式更改的数量。