[英]ParseExact cannot parse a string in RFC 3339 Internet Date/Time format
似乎 C# 无法以有效的 RFC 3339 格式解析时间:
DateTime.ParseExact("2019-12-31T00:00:00.123456789+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffffzzz", null)
此行引发异常,而此行工作正常:
DateTime.ParseExact("2019-12-31T00:00:00.1234567+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz", null)
所以似乎毫秒有限制,但我找不到任何相关文档。 这是应该的吗?
想要解析这个日期的原因是我有一个输入日期字段。 我们使用 OAS (Swagger) date-time
格式,它非常清楚地表明 RFC 3339 Internet 日期/时间格式中的任何日期都应该是有效的。 现在从这里的规范第 5.6 节
time-secfrac = "." 1*DIGIT
据我了解,这意味着最多应允许 9 位数字并且要 100% 兼容,我们必须允许这些输入,但 C# 似乎甚至不支持这一点。
关于如何解决它的任何想法?
根据MSDN规范,您只能使用fffffff
fffffff
自定义格式说明符表示秒小数的七个最高有效数字; 也就是说,它代表日期和时间值的百万分之一秒。
在你的第一个例子中
DateTime.ParseExact("2019-12-31T00:00:00.123456789+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffffzzz", null)
您正在使用fffffffff
,这对于 .NET 自定义日期和时间格式字符串更精确
据我所知,.NET 支持以毫秒为单位的七个最高有效数字,这是“fffffff”自定义格式说明符的用途。
“fffffff”自定义格式说明符表示秒小数的七个最高有效数字; 也就是说,它代表日期和时间值的百万分之一秒。
尽管可以显示时间值的百万分之一秒,但该值可能没有意义。 日期和时间值的精度取决于系统时钟的分辨率。
这意味着您提供了 .NET 框架不支持的无意义数据。 我强烈建议不要这样做。
除了其他答案中的信息之外,如果您无法更改输入并且仍想解析它,则可以使用以下解决方案之一:
如果您的输入将始终采用相同的格式(即,有 9 秒小数位),您可以删除两个额外的并继续解析它:
string input = "2019-12-31T00:00:00.123456789+01:00"; input = input.Remove(27, 2); // TODO: parse `input`.
如果您事先不知道秒小数位数,您可以使用以下内容:
string input = "2019-12-31T00:00:00.123456789+01:00"; string format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFzzz"; var regEx = new Regex(@"^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{1,7})\d*"); input = regEx.Replace(input, "$1"); DateTime parsedDate = DateTime.ParseExact(input, format, null);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.