2

似乎 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# 似乎甚至不支持这一点。

关于如何解决它的任何想法?

4

3 回答 3

2

根据MSDN规范,您只能使用fffffff

fffffff定义格式说明符表示秒小数的七个最高有效数字;也就是说,它代表日期和时间值的百万分之一秒。

在你的第一个例子中

DateTime.ParseExact("2019-12-31T00:00:00.123456789+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffffzzz", null)

您正在使用fffffffff哪个对 .NET 自定义日期和时间格式字符串更精确

于 2019-10-22T14:09:38.020 回答
1

据我所知,.NET 支持以毫秒为单位的七个最高有效数字,这是“fffffff”自定义格式说明符的用途。

“fffffff”自定义格式说明符表示秒小数的七个最高有效数字;也就是说,它代表日期和时间值的百万分之一秒。

尽管可以显示时间值的百万分之一秒,但该值可能没有意义。日期和时间值的精度取决于系统时钟的分辨率。

这意味着您提供了 .NET Framework支持的无意义数据。我强烈建议不要这样做。

于 2019-10-22T14:10:38.913 回答
0

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

  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);
    
于 2019-10-22T14:31:46.527 回答