Go内置时间常量格式(time包)对照表

Go 时间布局格式

Go 使用 参考时间 Mon Jan 2 15:04:05 MST 2006 来定义格式,而不是像 C 语言或 Python 的 %Y %m %d

类型标记含义示例(参考时间 2025-09-06 11:45:05.123456789)注意事项
2006四位年份2025常用于完整年份显示
06两位年份25适合老式格式或节省字符
01两位数字月份090 填充
1数字月份(无前导零)9方便简写
Jan英文缩写月份Sep三个字母英文缩写
January英文全称月份September更易读,长度可变
02两位数字日060 填充
_2空格填充日 6用于对齐,日<10时左侧空格
小时1524 小时制110-23
0312 小时制110-12,0 会显示为 12
312 小时制,无前导零110-12
分钟/秒04分钟45两位数字
0505两位数字
上下午PM大写 AM/PMAM12 小时制,区分大小写
pm小写 am/pmam12 小时制,区分大小写
时区MST时区缩写SGT / CST / UTC受系统时区影响,可能有歧义
-0700数值时区偏移(无冒号)+0800可解析性高,推荐用于存储/传输
Z07:00数值时区偏移(含冒号)+08:00Z(UTC)RFC3339 常用
字面量普通字符未被识别为时间占位符的字符按字面量输出"UTC 2006"UTC 2025单引号不是转义语法,只是普通字符
小数秒.000毫秒.123固定 3 位小数
.000000微秒.123456固定 6 位小数
.000000000纳秒.123456789固定 9 位小数
星期Mon英文缩写星期Sat三个字母
Monday英文全称星期Saturday适合全名显示
其他符号TISO 8601 中的时间分隔符T直接输出字母 T
- / : 直接输出-/:可以自由组合布局

注意事项

  1. 空格填充 vs 零填充
    • _2 → 空格填充的日,02 → 零填充。
  2. 时区选择
    • MST → 缩写,易读但解析可能歧义。
    • -0700/Z07:00 → 数值偏移,更标准、更安全。
  3. 12 小时制 vs 24 小时制
    • 3/03 → 12 小时制,配合 PM/pm
    • 15 → 24 小时制。
  4. 小数秒
    • StampMilli / StampMicro / StampNano 都基于 .000/.000000/.000000000

Go time 包时间格式常量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package time

const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
DateTime = "2006-01-02 15:04:05"
DateOnly = "2006-01-02"
TimeOnly = "15:04:05"
)

Go time 包时间格式常量对照表

名称布局字符串示例输出(2025-09-06 11:45:05 +08:00)典型用途注意事项
Layout01/02 03:04:05PM '06 -070009/06 11:45:05AM '25 +0800Go 的参考布局示例,展示格式规则实际项目中较少直接使用
ANSICMon Jan _2 15:04:05 2006Sat Sep 6 11:45:05 2025类 Unix 日志/老式系统_2 表示空格填充日期
UnixDateMon Jan _2 15:04:05 MST 2006Sat Sep 6 11:45:05 SGT 2025类 Unix 日期(带时区缩写)MST 会替换为实际时区缩写,可能有歧义
RubyDateMon Jan 02 15:04:05 -0700 2006Sat Sep 06 11:45:05 +0800 2025Ruby 默认日期格式使用数值时区,无歧义
RFC82202 Jan 06 15:04 MST06 Sep 25 11:45 SGT老邮件标准两位年份+时区缩写,解析不安全
RFC822Z02 Jan 06 15:04 -070006 Sep 25 11:45 +0800RFC822 数值时区版优于 RFC822,推荐
RFC850Monday, 02-Jan-06 15:04:05 MSTSaturday, 06-Sep-25 11:45:05 SGT早期 HTTP/邮件日期已过时
RFC1123Mon, 02 Jan 2006 15:04:05 MSTSat, 06 Sep 2025 11:45:05 SGT邮件/HTTP 历史格式HTTP 响应头建议使用 GMT 格式
RFC1123ZMon, 02 Jan 2006 15:04:05 -0700Sat, 06 Sep 2025 11:45:05 +0800RFC1123 数值时区版不符合 HTTP-date 对 GMT 的要求
RFC33392006-01-02T15:04:05Z07:002025-09-06T11:45:05+08:00JSON / API 常用UTC 时输出 Z,否则 +HH:MM
RFC3339Nano2006-01-02T15:04:05.999999999Z07:002025-09-06T11:45:05.123456789+08:00高精度 API 日志输出到纳秒,0 的处理依版本不同
Kitchen3:04PM11:45AM简洁 UI 时间显示无秒、无日期
StampJan _2 15:04:05Sep 6 11:45:05简洁日志时间戳无年、无时区
StampMilliJan _2 15:04:05.000Sep 6 11:45:05.000日志,带毫秒固定 3 位小数
StampMicroJan _2 15:04:05.000000Sep 6 11:45:05.000000日志,带微秒固定 6 位小数
StampNanoJan _2 15:04:05.000000000Sep 6 11:45:05.000000000日志,带纳秒固定 9 位小数
DateTime2006-01-02 15:04:052025-09-06 11:45:05数据库/日志常用无时区,解析时需额外设定
DateOnly2006-01-022025-09-06仅日期字段常见于表单、数据库
TimeOnly15:04:0511:45:05仅时间字段无日期、无时区

格式化输出测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package test

import (
"fmt"
"testing"
"time"
)

func TestName(t *testing.T) {
now := time.Now()
layouts := map[string]string{
"Layout": "01/02 03:04:05PM '06 -0700",
"ANSIC": time.ANSIC,
"UnixDate": time.UnixDate,
"RubyDate": time.RubyDate,
"RFC822": time.RFC822,
"RFC822Z": time.RFC822Z,
"RFC850": time.RFC850,
"RFC1123": time.RFC1123,
"RFC1123Z": time.RFC1123Z,
"RFC3339": time.RFC3339,
"RFC3339Nano": time.RFC3339Nano,
"Kitchen": time.Kitchen,
"Stamp": time.Stamp,
"StampMilli": time.StampMilli,
"StampMicro": time.StampMicro,
"StampNano": time.StampNano,
"DateTime": "2006-01-02 15:04:05",
"DateOnly": "2006-01-02",
"TimeOnly": "15:04:05",
}

for name, layout := range layouts {
fmt.Printf("%-12s : %s\n", name, now.Format(layout))
}

fmt.Println("\n-- UTC 格式化 --")
for name, layout := range layouts {
fmt.Printf("%-12s : %s\n", name, now.UTC().Format(layout))
}
}

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
=== RUN   TestName
ANSIC : Sat Sep 6 14:03:17 2025
UnixDate : Sat Sep 6 14:03:17 CST 2025
RubyDate : Sat Sep 06 14:03:17 +0800 2025
RFC822Z : 06 Sep 25 14:03 +0800
RFC850 : Saturday, 06-Sep-25 14:03:17 CST
RFC1123Z : Sat, 06 Sep 2025 14:03:17 +0800
RFC3339 : 2025-09-06T14:03:17+08:00
RFC3339Nano : 2025-09-06T14:03:17.9708592+08:00
Kitchen : 2:03PM
Stamp : Sep 6 14:03:17
StampNano : Sep 6 14:03:17.970859200
DateTime : 2025-09-06 14:03:17
DateOnly : 2025-09-06
TimeOnly : 14:03:17
Layout : 09/06 02:03:17PM '25 +0800
RFC822 : 06 Sep 25 14:03 CST
RFC1123 : Sat, 06 Sep 2025 14:03:17 CST
StampMilli : Sep 6 14:03:17.970
StampMicro : Sep 6 14:03:17.970859

-- UTC 格式化 --
UnixDate : Sat Sep 6 06:03:17 UTC 2025
RubyDate : Sat Sep 06 06:03:17 +0000 2025
RFC822Z : 06 Sep 25 06:03 +0000
RFC850 : Saturday, 06-Sep-25 06:03:17 UTC
RFC1123Z : Sat, 06 Sep 2025 06:03:17 +0000
RFC3339 : 2025-09-06T06:03:17Z
RFC3339Nano : 2025-09-06T06:03:17.9708592Z
Kitchen : 6:03AM
Stamp : Sep 6 06:03:17
StampNano : Sep 6 06:03:17.970859200
DateTime : 2025-09-06 06:03:17
DateOnly : 2025-09-06
TimeOnly : 06:03:17
Layout : 09/06 06:03:17AM '25 +0000
RFC822 : 06 Sep 25 06:03 UTC
RFC1123 : Sat, 06 Sep 2025 06:03:17 UTC
StampMilli : Sep 6 06:03:17.970
StampMicro : Sep 6 06:03:17.970859
ANSIC : Sat Sep 6 06:03:17 2025
--- PASS: TestName (0.01s)
PASS
    0 评论
avatar