繁体   English   中英

ParseExact 无法解析 RFC 3339 Internet 日期/时间格式的字符串

[英]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 框架支持的无意义数据。 我强烈建议不要这样做。

除了其他答案中的信息之外,如果您无法更改输入并且仍想解析它,则可以使用以下解决方案之一:

  1. 如果您的输入将始终采用相同的格式(即,有 9 秒小数位),您可以删除两个额外的并继续解析它:

     string input = "2019-12-31T00:00:00.123456789+01:00"; input = input.Remove(27, 2); // TODO: parse `input`.
  2. 如果您事先不知道秒小数位数,您可以使用以下内容:

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM