【发布时间】:2019-10-22 14:04:56
【问题描述】:
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 日期/时间格式中的任何日期都应该是有效的。现在来自规范here 第 5.6 节
time-secfrac = "." 1*DIGIT
据我了解,这意味着最多应允许 9 位数字,并且要 100% 兼容,我们必须允许这些输入,但 C# 似乎甚至不支持。
关于如何解决它的任何想法?
【问题讨论】:
-
很简单,.NET 最多支持 7 位毫秒
-
恕我直言,
1*DIGIT表示 1 个或多个数字。 -
在我的系统上,
DateTime.Parse("2019-12-31T00:00:00.123456789+01:00", CultureInfo.InvariantCulture)实际上可以正常工作并正确解析值(DateTimeOffset也是如此),使用它支持的所有毫秒精度,即使似乎没有办法指定它的明确格式。所以一种可能性是一个简单的正则表达式匹配来验证你有这个,然后在没有Exact的情况下解析它。 -
顺便说一句,RFC 3339 遵循 ISO8601 规范——该规范指出小数的位数不受标准限制,但需要通信双方同意。
-
是的。 1*DIGIT 表示至少 1 位,最多不限位数。 tools.ietf.org/html/rfc2234#section-3.6
标签: c# datetime openapi rfc3339