跳轉到

Customize datetime utilities

前情提要

日期時間不論在瀏覽器端抑或是伺服器端根據使用者當前所在時區和文化習慣,在數值和顯示上存在些微差異。於是建立一套標準應對此一情境隨著專案的擴展變得日益重要。

取得合法的日期格式 — 前端

使用 Intl.DateTimeFormat 格式化日期型態資料

利用此物件將日期時間資料依照文化習慣格式化,詳情請自行查閱相關文件。

日光節約時間

(反正就是加一個小時)

使用瀏覽器開發人員工具,開啟模擬裝置感應器

開發需要使用地理資訊(例如時區)的應用程式時,模擬裝置感應器 是一個十分好用的工具,它能夠幫助你覆寫當前地理位置以利測試。開啟方式也相當簡單:首先,開啟開發人員工具(F12)並按下 Ctrl + Shift + P 鍵,接著在跳出的輸入框內輸入 sensors,便會看到 Show Seneors 的選項,選擇此一選項即可。

取得合法的日期格式 — 後端

透過自定義日期轉換器,檢查日期合法性並回傳日期型別

// 定義 可允許轉換的字串格式
string[] formats = new string[]
{
    $"{CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern} {CultureInfo.CurrentCulture.DateTimeFormat.LongTimePattern}",
    "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz", // 此為javascript的datetime
};
string verifyDateStr = verifyDateTime?.ToString() ?? string.Empty;
if (DateTime.TryParseExact(
        verifyDateStr.Length >= 33 ? verifyDateStr.Substring(0, 33) : string.Empty,
        formats,
        CultureInfo.InvariantCulture,
        DateTimeStyles.None,
        out dateTime) ||
    DateTime.TryParse(verifyDateStr, out dateTime))
{
    // 回傳時間設定datetimekind local,讓toString("O") 可以正確顯示系統時區
    dateTime = dateTime.ToLocalTime();
    return dateTime.Year > 1910;
}

傳遞日期型別資料至前端

統一使用 toString("O") 回傳 ISO 8601 規範的格式至前端。

為何使用 DateTime 作為資料庫儲存日期資料的型別而非 Timestamp

身邊案例針對日期時間資料的處理歷程是這樣的:一開始資料庫和後端皆使用字串儲存(UTC+8)和處理日期,後來新的欄位開始使用日期型態建立、加上陸續出現跨時區的問題,讓管理層意識到這項問題的存在並著手解決,於是暫時將以往使用字串儲存的舊資料統一轉換成相應的日期型別以降低轉換的風險。