首页/开发/正则与编码速查/日期时间格式互换的规范做法

日期时间格式互换的规范做法

时间格式互换应走「解析成结构化时刻、在结构化层运算、再按目标格式输出」三步,而不是字符串替换;各体系记号的大小写与含义不同(POSIX 的 %M 是分、Java 的 MM 是月),Go 用固定参考时间做模板。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

先解析成时刻再格式化

各语言与平台的时间格式记号互不相同,靠字符串替换互相转换必然出错。规范做法是三步:用源格式解析成结构化时刻(含时区),在结构化层做运算或换算,再用目标格式输出。这样转换过程与记号的差异解耦,出问题也只需检查其中一段。

基本信息

POSIX 记号百分号形式,如 %Y-%m-%d %H:%M:%S,见于 C、Python、date 命令
Java 与 .NET 记号字母形式,如 uuuu-MM-dd HH:mm:ss、yyyy-MM-dd HH:mm:ss
JS 生态记号Intl 与内置格式化,或日期库的 YYYY-MM-DD HH:mm:ss 形式
Go 记号不使用占位字母,而是用固定参考时间 2006-01-02 15:04:05 作为模板
电子表格底层是序列号,显示格式与存储值分离,需注意单元格类型

典型使用场景

  • 接口迁移:把某一家的时间串改写成另一家要求的格式
  • 日志规范化:统一成 ISO 8601 便于检索与排序
  • 导出报表:源数据是毫秒时间戳,展示需要本地可读格式
  • 跨语言联调:确认 mm 在两边的含义是否一致
  • 解析用户输入:先按一组候选格式解析,避免误判

记号对照与示例

记号对照与示例
# 同一时刻 2026-10-17 09:30:00+08:00 的多种写法
POSIX/Python : %Y-%m-%d %H:%M:%S%z      -> 2026-10-17 09:30:00+0800
Java/.NET    : uuuu-MM-dd HH:mm:ssXXX   -> 2026-10-17 09:30:00+08:00
JS 日期库     : YYYY-MM-DD HH:mm:ssZ     -> 2026-10-17 09:30:00+08:00
Go           : 2006-01-02 15:04:05-07:00 -> 2026-10-17 09:30:00+08:00
# 关键对应:年 Y/yyyy,月 M/MM,日 d/dd,时 H/HH,分 m/mm,秒 s/ss,小数秒 f/SSS
# 注意大小写敏感:m 是月还是分,取决于所用记号体系

记号对应速查

含义POSIXJava 与 .NETJS 日期库
四位年%Yuuuu 或 yyyyYYYY
月%mMMMM
日%dddDD
二十四小时%HHHHH
分%Mmmmm
秒%Sssss
小数秒%fSSS 等单位SSS
带冒号偏移%z 通常无冒号XXXZ
Java 建议用 uuuu 而非 yyyy:yyyy 表示纪元年份,严格解析时需要同时提供纪元信息,跨纪元或年份补零的输入容易解析失败;具体取舍以官方文档为准。
电子表格的时间格式存在上下文歧义:同一个字母在小时之后的位置表示分钟,在日期位置表示月份。把时间当文本导入还可能被识别成数值序列号,导入前先指定列的文本类型。

易错点

  • 用字符串替换做格式转换,例如把 YYYY 直接换成 %Y,遇到大小写或位数差异时得到看似正确的错误时间
  • 混淆分钟与月份的记号:%M 与 %m、mm 与 MM 在不同体系里含义相反,写错后时间恒为某月某分
  • 解析时未要求完整字段,宽松解析把 2026-10-17 当成某月第一天并静默补默认值,数据从此不可信
  • 把带月名或时区缩写的本地化文本当作可移植格式传递,接收端区域设置不同即解析失败
  • 转换后丢弃时区信息:本地时间被当成 UTC 存储,事后无法还原真实时刻

数据来源与参考

  • Python 标准库文档:strftime 与 strptime 格式代码
  • Oracle Java 文档:DateTimeFormatter 模式字母
  • Go 标准库文档:time 包的布局常量说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/datetime-format-interchange.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​