首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

多語言日期時間格式化大對照:Java、C#、JavaScript、PHP、Ruby、Python、Go、Rust 模式字元速查表

     編輯:Java 相關知識

跨語言開發時,日期時間格式化模式字元差異極大 (如 yyyy vs YYYY vs %Y),導致日誌、API、資料庫遷移頻頻出錯。本文匯總主流 8 語言的格式化語法、標準/自定義模式、時區處理、線程安全特性,提供可直接複製的速查表與最佳實踐建議。

核心模式字元對照表 (年月日時分秒)

語義Java (SimpleDateFormat / DateTimeFormatter)C# (.NET)JavaScript (手寫/date-fns)PHP (date)Ruby (strftime)Python (strftime)Go (time.Format)Rust (chrono)
年 (4位)yyyy / yyyyyyyyYYYY / yyyyY%Y%Y2006%Y
年 (2位)yyyyYY / yyy%y%y06%y
月 (數字 1-12)MMMn%-m%-m1%-m
月 (兩位)MMMMMMm%m%m01%m
月 (縮寫)MMMMMMMMMM%b%bJan%b
月 (全名)MMMMMMMMMMMMF%B%BJanuary%B
日 (1-31)dddj%-d%-d2%-d
日 (兩位)ddddddd%d%d02%d
時 24h (0-23)HHHG%H%H15%H
時 24h 兩位HHHHHHH%H%H03%H
時 12h (1-12)hhhg%I%I3%I
分mmmi%M%M04%M
秒ssss%S%S05%S
毫秒/微秒SSS / SSSSSSfff / ffffffSSS / SSSSSSu / v%L / %N%f.000 / .000000%.3f / %.6f
AM/PMatta / AA / a%p%pPM%p
時區偏移Z / XXXzzz / KZ / XXO / P%z / %:z%z-0700 / -07:00%z / %:z
ISO 8601ISO_INSTANT / yyyy-MM-dd'T'HH:mm:ssXXXo / stoISOString()c%Y-%m-%dT%H:%M:%S%z%Y-%m-%dT%H:%M:%S%ztime.RFC3339%+ / RFC3339

各語言特色與陷阱

Java (java.time 推薦)

  • 舊版 SimpleDateFormat:非線程安全,月份 M、分鐘 m 易混淆。
  • 新版 DateTimeFormatter:不可變、線程安全、預定義 ISO_LOCAL_DATE_TIME 等常量。
  • yyyy vs YYYY:YYYY 是週年 (Week-based year),跨年週會導致年份錯誤,**永遠用 yyyy**。

C# (.NET)

  • DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"):標準/自定義格式字串統一。
  • 標準格式字元:d(短日期) D(長日期) t(短時間) T(長時間) f(完整日期短時間) F(完整日期長時間) g(通用短) G(通用長) u(通用可排序 UTC) U(完整 UTC)。
  • DateTime.UtcNow 直接取得 UTC,避免時區轉換 Bug。

JavaScript

  • 原生 Date 無格式化方法,toLocaleString() 受瀏覽器/地區設定影響不可靠。
  • 生產必裝:date-fns (函數式、樹搖優化) 或 dayjs (Moment.js 兼容 API、體積小) 或 luxon (Intl API 封裝、不可變)。
  • date-fns 模式:yyyy MM dd HH mm ss SSS 與 Java DateTimeFormatter 高度一致。

PHP

  • date("Y-m-d H:i:s"):字元區分大小寫 (Y 年、y 兩位年),m 月、i 分 易混。
  • DateTime 物件導向 API:$dt->format('Y-m-d'),支援時區 new DateTimeZone('Asia/Taipei')。

Ruby

  • Time.now.strftime("%Y-%m-%d %H:%M:%S"):標準 C strftime 格式,% 前綴。
  • Time 含完整時間、Date 僅日期,DateTime 兼具。
  • 中文星期需自建陣列 %w 索引。

Python

  • datetime.now().strftime("%Y-%m-%d %H:%M:%S"):同 C strftime。
  • f-string 格式化 (3.6+):f"{dt:%Y-%m-%d %H:%M:%S}" 更簡潔。
  • pendulum / arrow 庫提供更人性化 API 與時區支援。

Go

  • 獨創參考時間格式化:time.Now().Format("2006-01-02 15:04:05") — 必須記住 2006-01-02 15:04:05 (月日時分秒年) 這個魔法參考時間,而非佔位符。
  • 常用常量:time.RFC3339, time.RFC1123, time.Kitchen。

Rust (chrono crate)

  • chrono::Local::now().format("%Y-%m-%d %H:%M:%S").to_string():標準 strftime 兼容。
  • 強類型時區:DateTime<Utc>, DateTime<Local>, DateTime<FixedOffset> 編譯期保證正確。

跨語言傳輸最佳實踐

  1. 統一用 ISO 8601 / RFC 3339:2024-01-15T14:30:45+08:00 (含時區偏移) 或 2024-01-15T06:30:45Z (UTC)。所有語言標準庫皆支援零配置解析/生成。
  2. API 契約強制時區:要求所有時間字串必須包含時區資訊 (Z 或 ±HH:MM),拒絕無時區字串 (視為本地時間極易出錯)。
  3. 資料庫存儲:統一存 TIMESTAMP WITH TIME ZONE (PostgreSQL) / DATETIMEOFFSET (SQL Server) / TIMESTAMP + 應用層約定 UTC (MySQL)。
  4. 序列化庫統一配置:Jackson (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS=false), Newtonsoft.Json (DateFormatHandling.IsoDateFormat), Serde (with_timezone) 統一輸出 ISO 8601。
  5. 日誌時間戳:統一 UTC + ISO 8601,便於跨時區系統合併分析。

快速驗證腳本 (可複製到各語言 REPL)

# Java (jshell)
java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))

# C# (csi / dotnet script)
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

# JavaScript (Node + date-fns)
require('date-fns').format(new Date(), 'yyyy-MM-dd HH:mm:ss')

# PHP (php -a)
date('Y-m-d H:i:s')

# Ruby (irb)
Time.now.strftime("%Y-%m-%d %H:%M:%S")

# Python (python3)
from datetime import datetime; datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# Go (go run)
package main; import ("fmt"; "time"); func main() { fmt.Println(time.Now().Format("2006-01-02 15:04:05")) }

# Rust (cargo + chrono)
chrono::Local::now().format("%Y-%m-%d %H:%M:%S").to_string()

總結

日期時間格式化看似瑣碎,實則是跨系統數據一致性的基石。記住三個鐵律:1. 內部處理用強類型時間物件,不玩字串;2. 外部交換統一 ISO 8601 + 時區;3. 遷移舊代碼時優先替換格式化/解析邊界層。收藏本速查表,下次跨語言對接時間字段時,再也不用在文檔間來回跳轉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved