简体中文

开发者工具·Unix时间戳转换器

ISO 8601 与 RFC 3339:API 响应背后的两种日期格式

· 背景

时间戳 iso-8601 API

一种广泛的日期时间格式漏斗,缩小为一个 API 合约
原始 ToolAcre 矢量图

大多数 API 声称使用 ISO 8601 并且实际上使用 RFC 3339,这是一种专为互联网设计的更严格的配置文件。这篇文章解释了这两个文档、它们的差异以及它们与纪元整数的关系。

拒绝有效 ISO 8601 的“ISO 8601”字段 — 发送到需要 RFC 3339 的 API 的周日期或降低精度的值

随意描述为“ISO 8601”的 API 字段可能只接受一种日期时间形状。发送另一个标准有效的表示仍然可能导致解析器失败。补救办法是不要从总称上争论;它是通过示例和验证测试来记录精确的线语法。

ToolAcre 提供了 `Date.toISOString()` 的稳定规范输出,但它并不是适用于每种表示的一致性套件。将生成的字符串视为一种有用的交换形式,并将其与您实际拥有的 API 合约进行比较。

因此,只有在准确反映解析器的情况下,模式才应发布正则表达式或形式类型。单独的例子是有用的,但明确拒绝的情况会导致歧义。

广义的日期标准和狭义的 API 语法不可互换

生成的表单包含日历日期、`T`、以毫秒为单位的时间以及尾随 Z。实现在 UI 中将其称为 ISO 8601 (UTC)。输入接受 JavaScript Date 读取的内容,包括显式偏移量和本地选择器的无区域日期时间形状。

该行为比完整的标准解析器要窄得多。周日期、间隔、持续时间和降低的精度没有存储库测试。因此,一个浏览器 Date 接受的字符串不能跨语言保证,并且被拒绝的特殊形式也不能反驳它在其他地方的地位。

输出的固定毫秒精度是一种格式选择,而不是源测量毫秒的证据。 Date 可能已收到整秒值,但仍打印 `.000`。

ToolAcre 发出一种 ISO 形状的形式;它不验证完整的 ISO 8601 标准

该工作簿描述了 RFC 3339、其年份和强制偏移规则。源集中不存在 RFC 文本或专用解析器,因此不会断言这些细节。创作合同要求忽略不支持的精度,而不是从记忆中引用标题。

如果您的 API 表示 RFC 3339,请在架构中命名它并针对基于实际规范的实现进行测试。 ToolAcre 可以将已知纪元与其 UTC ISO 输出桥接以进行比较,但它无法证明任意输入满足该配置文件。

这是一种编辑和工程保障:标准配置文件是精确的合同,在没有文本的情况下解释它们可能会改变文档中的要求。

RFC 3339 要求需要此存储库中不存在的外部标准源

关于备用分隔符、小写指示符和 `−00:00` 的声明取决于确切的标准语言。这里省略了它们。转换器自己的区域检测器可识别尾随 Z 或数字 `±HH:MM` 并将无区域日期时间标记为本地;这是我们可以验证的边界。

根据明确接受的示例和拒绝案例构建 API 验证。不要从 JavaScript Date 的便捷解析器推断权限。宽松的浏览器可以规范严格服务器正确拒绝的输入,从而在手动测试期间隐藏互操作性缺陷。

专用的标准感知解析器应返回结构化错误原因。让 Date 标准化广泛的输入可以将 API 验证错误转变为以后的跨平台差异。

在没有标准文本的情况下,省略了特定的分隔符和未知偏移量规则

纪元值使算术和排序变得紧凑。文本日期时间使 UTC 或偏移量读数对人们可见,并在传输过程中保留该指示符。许多 API 选择一种规范字符串来避免 JavaScript 整数或单位歧义。

如果 API 两者都包含,则定义哪个字段是权威的并测试协议。陈旧的格式化字符串与新纪元旁边的情况比单独使用任何一个都更糟糕。 ToolAcre 可以通过转换整数并检查生成的 ISO 值来比较该对,但一致性强制属于生产者。

工作示例:一个瞬间,四种表示形式 - 纪元秒、纪元毫秒、UTC 格式的 RFC 3339 字符串和一个具有本地偏移量的字符串

使用即时 `2025-02-03T10:22:00.000Z`。其纪元形式为 1,738,578,120 秒和 1,738,578,120,000 毫秒。显式偏移读数为 `2025-02-03T12:22:00+02:00`;在 ToolAcre 中解析它会返回相同的纪元和规范的 UTC ISO 行。

这是四种存储库可验证的表示形式:秒、毫秒、toISOString 输出和日期解析的数字偏移字符串。该示例并未声明每个外部解析器都接受相同的小数精度或偏移语法。在发货前运行 API 自己的验证。

从写入时钟中减去 +02:00 偏移量得到 10:22 UTC。这个简单的等式足以测试这个特定的输入,而无需概括完整的标准语法。

工作示例:此存储库可以验证的四种形式中的一个瞬间

HTTP 标头和电子邮件日期使用此处未实现的文本约定。 ToolAcre 不格式化这些协议,也不承诺其 ISO 输出可以被替换。时间戳的时刻可以相同,但其所需的线路表示不同。

将协议序列化保存在专用适配器中,并使用从权威规范复制的固定装置。使用纪元转换来验证底层瞬间,然后单独测试语法。这可以防止日历正确的值在语法无效的信封中通过审查。

专用适配器还应该保留丢失或未知的偏移是否携带域含义。将每个文本日期扁平化为本地假设可能会破坏该信息。

其他文本协议保留在转换器之外

指定您的 API 接受的窄格式,而不是依赖宽标签。对于此工具,最安全的可重现输出是 `toISOString()` 返回的 UTC ISO 字符串,最安全的数字输入包括显式的秒或毫秒约定。

ToolAcre 连接这些表格并报告假设。它不会裁定所有 ISO 8601 或 RFC 3339 边缘情况。语法、单位和区域指示符的明确所有权使得时间戳具有可移植性,而不是将熟悉的标准名称附加到未指定的字段。

精确的合约可以让客户尽早失败并提供有用的消息。宽泛的标签将分歧推入运行时,两个原本正确的解析器可以选择不同的子集。