ASP.NET中无法验证ISO 8601格式的Date.Now生成日期字符串
解决ASP.NET中
Date.TryParseExact验证ISO 8601日期字符串的问题 嘿,我看你在用Date.TryParseExact验证那串带时区偏移的ISO日期时碰壁了,咱们来捋清楚问题出在哪,然后搞定它!
原有格式数组的几个坑
你写的格式串里有几个大小写和语法错误,这是导致匹配失败的核心原因:
- 月份得用大写的
MM,小写的mm是分钟的意思,你写的yyyy-mm-dd会把月份字段当成分钟解析,完全不对路。 - 小时部分如果是24小时制(比如目标字符串里的
11),必须用大写的HH,小写的hh是12小时制,根本匹配不上。 - 时区偏移的格式写法错了,不能用
+|-hh:mm这种语法,正确的带偏移的格式应该用zzz(对应+00:00这种格式),或者用K(兼容Z和+hh:mm两种时区标识)。 - 毫秒位数要对应,目标字符串有7位小数,格式里得用
fffffff,你之前有的格式用了nnnnnnn,虽然.NET里DateTime精度是100纳秒,但这里用fffffff就足够匹配。
修正后的格式集合
把格式数组改成下面这样,就能完美匹配你的目标日期字符串"2018-01-17T11:12:42.0544453+00:00"了:
Dim formats() As String = { "yyyy-MM-dd", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm:ss.fff", "yyyy-MM-ddTHH:mm:ss.fffffff", "yyyy-MM-ddTHH:mm:ss.fffffffzzz" }
完整验证代码示例
直接用这段代码测试就能成功解析了:
Dim dt As DateTime Dim formats() As String = { "yyyy-MM-dd", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm:ss.fff", "yyyy-MM-ddTHH:mm:ss.fffffff", "yyyy-MM-ddTHH:mm:ss.fffffffzzz" } If Date.TryParseExact("2018-01-17T11:12:42.0544453+00:00", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, dt) Then ' 解析成功,这里可以处理你的DateTime对象 Console.WriteLine($"解析成功:{dt.ToString()}") Else Console.WriteLine("解析失败") End If
额外小提示
如果你的业务场景里还会遇到带Z标识的UTC日期(比如"2018-01-17T11:12:42.0544453Z"),可以在格式数组里再加一项"yyyy-MM-ddTHH:mm:ss.fffffffZ",这样就能兼容两种时区格式啦。
内容的提问来源于stack exchange,提问作者DreamTeK
相关产品推荐
相关产品推荐

