MiServe DevTools

我的贴纸

把工具固定在这里,会保存在此浏览器中。

Go 时间格式与 strftime 转换器

编写 Go 时间布局并查看当前时间按它格式化的结果,在 Go 布局和 strftime 之间互相转换,并查询参考时间的各个标记。

编辑任意一个字段,另一个会随之更新。

按此布局显示的当前时间

预定义布局
参考时间标记

Go 的参考时间是 Mon Jan 2 15:04:05 MST 2006。写成 01/02 03:04:05PM '06 -0700 时,各部分依次是 1 到 7:月、日、时、分、秒、年和时区偏移。 选择一个标记,即可将其插入布局中光标所在的位置。

Go 标记含义strftime当前
年份,四位数 %Y
年份,后两位 %y
月份数字,两位 %m
月份数字,不补零 %-m
月份名称,缩写 %b
月份名称,全称 %B
日期,两位 %d
日期,不补零 %-d
日期,不足两位时用空格补齐 %e
一年中的第几天,三位 %j
24 小时制的小时,两位 %H
12 小时制的小时,两位 %I
12 小时制的小时,不补零 %-I
分钟,两位 %M
秒,两位 %S
AM 或 PM %p
星期名称,缩写 %a
星期名称,全称 %A
时区缩写 %Z
UTC 偏移(时和分),不带冒号 %z
UTC 偏移(时和分),带冒号 %:z
带冒号的 UTC 偏移,偏移为零时输出字母 Z —
秒的小数部分,位数固定,每个 0 对应一位 .%L
秒的小数部分,去掉末尾的零,每个 9 最多对应一位 —

通过 WebAssembly 在浏览器中运行。粘贴的内容不会被上传。

关于此工具

布局是一个示例,而不是模式

大多数语言用 %Y-%m-%d 或 YYYY-MM-DD 这样的占位符来描述日期格式。Go 的做法不同:你写出某个特定时刻(即参考时间)应该是什么样子,time.Format 就会按同样的方式输出其他任何时间。参考时间是 Mon Jan 2 15:04:05 MST 2006。

这些值是特意挑选的:按美国的顺序写成 01/02 03:04:05PM '06 -0700 时,它们依次递增——月 1、日 2、时 3(24 小时制为 15)、分 4、秒 5、年 6,以及负 7 小时的时区偏移。每个值只能代表一种含义,Go 就是这样知道 01 是月、04 是分钟的。

常见错误

因为 01 是月、02 是日,日在前的日期要写成 02/01/2006,习惯了参考顺序的人会觉得这看起来不对。按其他习惯写的布局也不会报错。Go 会把不认识的内容当作字面文本原样输出,所以 YYYY-MM-DD 输出后保持不变;而它认识的每个数字都会被当作标记,所以 2021-12-25 会输出成一串毫不相干的数字。

标记无法转义。恰好包含标记的文本会被替换,所以布局中字面的 Jan、Mon 或 2 这样的数字都会变成具体的值。这类文本请放在布局之外再拼接。

Z07:00 在 UTC 时输出 Z,否则输出数字偏移量,这正是 RFC 3339 的要求;而 -07:00 总是输出数字。对于秒的小数部分,.000 保留末尾的零,.999 则去掉它们。月份和星期名称始终是英文。

预览和转换的原理

预览由 Go 自身的 time.Format 生成,它被编译为 WebAssembly 并在你的浏览器中运行,所以显示的正是 Go 程序在同一时刻和偏移下输出的内容。当前时间、你所在时区的 UTC 偏移及其缩写由浏览器提供。如果浏览器没有你所在时区的缩写,就使用 +03 这样的数字形式,Go 对没有字母缩写的时区也是这样输出的。对于某些时区,浏览器给出的缩写与 Go 读取的时区数据库中的不同。

这两种格式涵盖的内容并不相同。strftime 没有与 Z07:00 行为相同的指令,Go 也没有表示周数(%U、%W、%V)、数字星期(%u、%w)或自纪元起的秒数(%s)的标记。转换器会原样保留这些部分,并在字段下方列出。strftime 格式中会被 Go 当作标记的字面文本也会被列出,因为布局无法容纳它。

strftime 一侧的部分指令是扩展,并非所有实现都支持:去掉补齐的标志(%-d)、带冒号的偏移(%:z),以及小数指令 %L、%f 和 %N。请查阅你要转换的目标语言的文档。

常见问题

为什么 Go 用 2006-01-02 15:04:05 而不是 YYYY-MM-DD?

Go 布局表示的是一个固定的参考时间 Mon Jan 2 15:04:05 MST 2006 应该如何输出。它的各部分按月、日、时、分、秒、年、时区偏移的顺序正好是数字 1 到 7,所以每个数字都能确定日期中的一个部分,不需要任何占位符语法。

ISO 8601 或 RFC 3339 时间戳对应的 Go 布局是什么?

使用 2006-01-02T15:04:05Z07:00,即常量 time.RFC3339。需要秒的小数部分时使用 time.RFC3339Nano,即 2006-01-02T15:04:05.999999999Z07:00。

如何在 Go 布局中输出毫秒?

在秒后面加上 .000,如 15:04:05.000。每个 0 代表一位,所以 .000000 表示微秒。如果想去掉末尾的零,改用 9,如 .999。

如何在 Go 布局中使用 24 小时制?

把小时写成 15。03 和 3 表示 12 小时制,通常与 PM 搭配使用,PM 会输出 AM 或 PM。

时间分类的其他工具