具代表性的面試主題

如何用 JavaScript Temporal 正確處理跨時區預約?

程式題中等
Offer.cc 編輯團隊發佈 更新

題幹

請設計一個跨時區預約功能:使用者選擇本地日期時間,系統需要在目標時區準確提醒並支援夏令時間變化。請用 Temporal 說明型別選擇、轉換、持久化和例外處理。

題目與背景

一個全球預約系統接收「紐約時間 2026-11-01 01:30」的輸入,並在參與者所在時區顯示和提醒。請使用 JavaScript Temporal 設計從輸入、時區解析、持久化到顯示的流程,處理夏令時間重複或不存在的本地時間。不要用一個裸字串或 Date 物件混淆日期、時間和時區語意。

面試官考察什麼

重點是區分 Temporal.InstantTemporal.ZonedDateTimeTemporal.PlainDateTimeTemporal.PlainDate,理解 IANA 時區規則、DST 歧義、精度與序列化。優秀答案會說明業務曆法日期不能直接轉成 UTC 瞬時點,以及如何固定曆法系統。

先問清楚的澄清問題

輸入語意

確認使用者輸入是「某時區的牆上時間」還是已確定的瞬時點,時區來自事件、組織還是瀏覽器。缺少時區就不能可靠解釋本地時間。

DST 歧義策略

確認不存在或重複時間時是拒絕、選擇較早、選擇較晚還是讓使用者確認。預設策略必須寫入產品契約,不能由執行時偶然決定。

持久化需求

確認提醒是否代表一次絕對瞬時事件,還是每年在當地日期重複。一次性預約與生日類規則需要不同的 Temporal 型別。

30 秒回答框架

「先把使用者輸入保留為 PlainDateTime 與明確的 IANA 時區,再按產品策略轉換成 ZonedDateTimeInstant。一次性提醒持久化 Instant,顯示時用參與者時區重新轉換;重複曆法事件持久化日期、時間、時區和曆法規則。對 DST 缺失或重複時間顯式拒絕或選擇策略,並保存原始語意,避免使用 Date 的隱式本地時區解析。」

深入解答步驟

第一步:選擇正確型別

PlainDate 表示沒有時區的曆法日期,PlainDateTime 表示沒有時區的牆上時間,ZonedDateTime 綁定 IANA 時區,Instant 表示時間線上的單一點。先判斷業務語意再選型別。

第二步:解析並綁定時區

解析使用者輸入得到 PlainDateTime,從可信設定取得時區識別,再組合成 ZonedDateTime。禁止把瀏覽器預設時區或伺服器時區偷偷當作事件時區。

第三步:處理 DST 變化

春季跳時會產生不存在的本地時間,秋季回撥會產生重複的本地時間。使用明確的 disambiguation 策略,例如拒絕並讓使用者重選,或在需求允許時選擇 earlier/later;把選擇記錄在預約資料中。

第四步:轉換為提醒瞬時點

一次性預約從 ZonedDateTime 取得 Instant 並以標準化字串保存。調度器按 Instant 觸發,展示層再根據查看者時區轉換,而不是重新解釋原始牆上時間。

第五步:保存重複事件語意

每年某地 09:00 的事件不能只保存一個 UTC 偏移,因為 DST 會改變偏移。保存 PlainDatePlainTime、IANA 時區和曆法系統,每次發生時重新解析成當年的 ZonedDateTime

第六步:定義精度與曆法

明確是否需要毫秒、微秒或奈秒精度,序列化時不要截斷導致排序錯誤。跨曆法業務要保存 calendar 識別,不能把使用者曆法日期直接當成 ISO 公曆日期。

第七步:測試邊界

覆蓋 DST 跳時和回撥、跨年、閏日、時區資料庫更新、不同語言環境和序列化往返。測試應斷言瞬時點、當地展示和重複規則分別正確,而不只比較字串。

高品質示例回答

我會將輸入解析為 PlainDateTime,要求事件攜帶 IANA 時區,再按明確的 DST 歧義策略組合成 ZonedDateTime。一次性提醒持久化 Instant,展示時按查看者時區轉換;重複事件持久化當地日期、時間、時區和曆法規則,每次生成新的瞬時點。測試覆蓋缺失/重複時間、閏日、時區庫更新和序列化精度,避免 Date 的隱式時區行為。

常見錯誤

  • 錯誤:PlainDateTime 直接當 UTC。→ 原因: 它沒有時區語意。→ 改進: 先綁定明確的 IANA 時區。
  • 錯誤: 每年重複事件只保存 UTC 偏移。→ 原因: DST 會改變當地偏移。→ 改進: 保存當地時間和時區規則。
  • 錯誤: 忽略秋季回撥的重複時間。→ 原因: 一個牆上時間對應兩個瞬時點。→ 改進: 拒絕或顯式選擇 earlier/later。
  • 錯誤: 只用字串比較驗證結果。→ 原因: 字串無法證明瞬時點和曆法語意。→ 改進: 分別斷言 Instant、ZonedDateTime 和重複規則。

追問與回答

追問 1:什麼時候應該持久化 Instant?

當事件代表時間線上的一次絕對發生,例如傳送提醒或記錄付款。查看者時區只影響展示,不應改變該瞬時點。

追問 2:為什麼生日不能保存成 Instant?

生日表達的是當地曆法日期,通常不代表某個全球同時發生的瞬時點。保存日期、時區和曆法規則,發生時再計算 Instant。

追問 3:時區資料庫更新會影響已保存預約嗎?

會。未來本地時間的規則可能變化,因此保存原始時區和語意,並記錄規則版本或在重新計算時採用明確的業務策略。

追問 4:Temporal 能否自動決定 DST 歧義?

API 可以提供 disambiguation 選項,但產品仍需決定拒絕、取早、取晚或相容。不能把預設選項當成業務共識。

公開來源

同類題目

相關面試工具

用 Screenshot 處理演算法題

截圖題目後,依序看約束、解法、程式碼、邊界條件和複雜度。

查看工具