開發者工具·Unix時間戳轉換器
ISO 8601 與 RFC 3339:API 回應背後的兩種日期格式
· 背景
時間戳 iso-8601 API
大多數 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 邊緣情況。語法、單位和區域指示符的明確所有權使得時間戳具有可移植性,而不是將熟悉的標準名稱附加到未指定的欄位。
精確的合約可以讓客戶端儘早失敗並提供有用的訊息。當寬泛的標籤將分歧推入執行時,兩個原本正確的解析器可以選擇不同的子集。