Skip to content

Commit a997c05

Browse files
committed
Go内置时间常量格式(time包)对照表
1 parent 53963e0 commit a997c05

1 file changed

Lines changed: 205 additions & 0 deletions

File tree

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
---
2+
layout: post
3+
title: Go内置时间常量格式(time包)对照表
4+
date: 2025-09-06 13:43:56
5+
tags:
6+
- go
7+
- 时间
8+
categories:
9+
- 学习笔记
10+
---
11+
12+
## Go 时间布局格式
13+
14+
Go 使用 **参考时间** `Mon Jan 2 15:04:05 MST 2006` 来定义格式,而不是像 C 语言或 Python 的 `%Y %m %d`
15+
16+
| 类型 | 标记 | 含义 | 示例(参考时间 2025-09-06 11:45:05.123456789) | 注意事项 |
17+
|----------|-----------------|------------------|----------------------------------------|-----------------|
18+
| **** | `2006` | 四位年份 | `2025` | 常用于完整年份显示 |
19+
| | `06` | 两位年份 | `25` | 适合老式格式或节省字符 |
20+
| **** | `01` | 两位数字月份 | `09` | 0 填充 |
21+
| | `1` | 数字月份(无前导零) | `9` | 方便简写 |
22+
| | `Jan` | 英文缩写月份 | `Sep` | 三个字母英文缩写 |
23+
| | `January` | 英文全称月份 | `September` | 更易读,长度可变 |
24+
| **** | `02` | 两位数字日 | `06` | 0 填充 |
25+
| | `_2` | 空格填充日 | ` 6` | 用于对齐,日<10时左侧空格 |
26+
| **小时** | `15` | 24 小时制 | `11` | 0-23 |
27+
| | `03` | 12 小时制 | `11` | 0-12,0 会显示为 12 |
28+
| | `3` | 12 小时制,无前导零 | `11` | 0-12 |
29+
| **分钟/秒** | `04` | 分钟 | `45` | 两位数字 |
30+
| | `05` || `05` | 两位数字 |
31+
| **上下午** | `PM` | 大写 AM/PM | `AM` | 12 小时制,区分大小写 |
32+
| | `pm` | 小写 am/pm | `am` | 12 小时制,区分大小写 |
33+
| **时区** | `MST` | 时区缩写 | `SGT` / `CST` / `UTC` | 受系统时区影响,可能有歧义 |
34+
| | `-0700` | 数值时区偏移(无冒号) | `+0800` | 可解析性高,推荐用于存储/传输 |
35+
| | `Z07:00` | 数值时区偏移(含冒号) | `+08:00``Z`(UTC) | RFC3339 常用 |
36+
| **引号** | `'...'` | 单引号内内容按字面量输出 | `"'06"``'25` | 可在格式中插入固定字符 |
37+
| **小数秒** | `.000` | 毫秒 | `.123` | 固定 3 位小数 |
38+
| | `.000000` | 微秒 | `.123456` | 固定 6 位小数 |
39+
| | `.000000000` | 纳秒 | `.123456789` | 固定 9 位小数 |
40+
| **星期** | `Mon` | 英文缩写星期 | `Sat` | 三个字母 |
41+
| | `Monday` | 英文全称星期 | `Saturday` | 适合全名显示 |
42+
| **其他符号** | `T` | ISO 8601 中的时间分隔符 | `T` | 直接输出字母 T |
43+
| | `-` `/` `:` ` ` | 直接输出 | `-``/``:` | 可以自由组合布局 |
44+
45+
注意事项
46+
47+
1. **空格填充 vs 零填充**
48+
* `_2` → 空格填充的日,`02` → 零填充。
49+
2. **时区选择**
50+
* `MST` → 缩写,易读但解析可能歧义。
51+
* `-0700`/`Z07:00` → 数值偏移,更标准、更安全。
52+
3. **12 小时制 vs 24 小时制**
53+
* `3`/`03` → 12 小时制,配合 `PM`/`pm`
54+
* `15` → 24 小时制。
55+
4. **小数秒**
56+
* `StampMilli` / `StampMicro` / `StampNano` 都基于 `.000`/`.000000`/`.000000000`
57+
58+
## Go time 包时间格式常量
59+
60+
~~~go
61+
package time
62+
63+
const (
64+
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
65+
ANSIC = "Mon Jan _2 15:04:05 2006"
66+
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
67+
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
68+
RFC822 = "02 Jan 06 15:04 MST"
69+
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
70+
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
71+
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
72+
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
73+
RFC3339 = "2006-01-02T15:04:05Z07:00"
74+
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
75+
Kitchen = "3:04PM"
76+
// Handy time stamps.
77+
Stamp = "Jan _2 15:04:05"
78+
StampMilli = "Jan _2 15:04:05.000"
79+
StampMicro = "Jan _2 15:04:05.000000"
80+
StampNano = "Jan _2 15:04:05.000000000"
81+
DateTime = "2006-01-02 15:04:05"
82+
DateOnly = "2006-01-02"
83+
TimeOnly = "15:04:05"
84+
)
85+
86+
~~~
87+
88+
## Go time 包时间格式常量对照表
89+
90+
| 名称 | 布局字符串 | 示例输出(2025-09-06 11:45:05 +08:00) | 典型用途 | 注意事项 |
91+
|-----------------|---------------------------------------|---------------------------------------|-------------------|-------------------------|
92+
| **Layout** | `01/02 03:04:05PM '06 -0700` | `09/06 11:45:05AM '25 +0800` | Go 的参考布局示例,展示格式规则 | 实际项目中较少直接使用 |
93+
| **ANSIC** | `Mon Jan _2 15:04:05 2006` | `Sat Sep 6 11:45:05 2025` | 类 Unix 日志/老式系统 | `_2` 表示空格填充日期 |
94+
| **UnixDate** | `Mon Jan _2 15:04:05 MST 2006` | `Sat Sep 6 11:45:05 SGT 2025` | 类 Unix 日期(带时区缩写) | `MST` 会替换为实际时区缩写,可能有歧义 |
95+
| **RubyDate** | `Mon Jan 02 15:04:05 -0700 2006` | `Sat Sep 06 11:45:05 +0800 2025` | Ruby 默认日期格式 | 使用数值时区,无歧义 |
96+
| **RFC822** | `02 Jan 06 15:04 MST` | `06 Sep 25 11:45 SGT` | 老邮件标准 | 两位年份+时区缩写,解析不安全 |
97+
| **RFC822Z** | `02 Jan 06 15:04 -0700` | `06 Sep 25 11:45 +0800` | RFC822 数值时区版 | 优于 RFC822,推荐 |
98+
| **RFC850** | `Monday, 02-Jan-06 15:04:05 MST` | `Saturday, 06-Sep-25 11:45:05 SGT` | 早期 HTTP/邮件日期 | 已过时 |
99+
| **RFC1123** | `Mon, 02 Jan 2006 15:04:05 MST` | `Sat, 06 Sep 2025 11:45:05 SGT` | HTTP-date(旧版) | 通常用 `GMT`,时区缩写有歧义 |
100+
| **RFC1123Z** | `Mon, 02 Jan 2006 15:04:05 -0700` | `Sat, 06 Sep 2025 11:45:05 +0800` | HTTP-date(推荐版) | 更精确,兼容性好 |
101+
| **RFC3339** | `2006-01-02T15:04:05Z07:00` | `2025-09-06T11:45:05+08:00` | JSON / API 常用 | UTC 时输出 `Z`,否则 `+HH:MM` |
102+
| **RFC3339Nano** | `2006-01-02T15:04:05.999999999Z07:00` | `2025-09-06T11:45:05.123456789+08:00` | 高精度 API 日志 | 输出到纳秒,0 的处理依版本不同 |
103+
| **Kitchen** | `3:04PM` | `11:45AM` | 简洁 UI 时间显示 | 无秒、无日期 |
104+
| **Stamp** | `Jan _2 15:04:05` | `Sep 6 11:45:05` | 简洁日志时间戳 | 无年、无时区 |
105+
| **StampMilli** | `Jan _2 15:04:05.000` | `Sep 6 11:45:05.000` | 日志,带毫秒 | 固定 3 位小数 |
106+
| **StampMicro** | `Jan _2 15:04:05.000000` | `Sep 6 11:45:05.000000` | 日志,带微秒 | 固定 6 位小数 |
107+
| **StampNano** | `Jan _2 15:04:05.000000000` | `Sep 6 11:45:05.000000000` | 日志,带纳秒 | 固定 9 位小数 |
108+
| **DateTime** | `2006-01-02 15:04:05` | `2025-09-06 11:45:05` | 数据库/日志常用 | 无时区,解析时需额外设定 |
109+
| **DateOnly** | `2006-01-02` | `2025-09-06` | 仅日期字段 | 常见于表单、数据库 |
110+
| **TimeOnly** | `15:04:05` | `11:45:05` | 仅时间字段 | 无日期、无时区 |
111+
112+
## 格式化输出测试
113+
114+
~~~go
115+
package test
116+
117+
import (
118+
"fmt"
119+
"testing"
120+
"time"
121+
)
122+
123+
func TestName(t *testing.T) {
124+
now := time.Now()
125+
layouts := map[string]string{
126+
"Layout": "01/02 03:04:05PM '06 -0700",
127+
"ANSIC": time.ANSIC,
128+
"UnixDate": time.UnixDate,
129+
"RubyDate": time.RubyDate,
130+
"RFC822": time.RFC822,
131+
"RFC822Z": time.RFC822Z,
132+
"RFC850": time.RFC850,
133+
"RFC1123": time.RFC1123,
134+
"RFC1123Z": time.RFC1123Z,
135+
"RFC3339": time.RFC3339,
136+
"RFC3339Nano": time.RFC3339Nano,
137+
"Kitchen": time.Kitchen,
138+
"Stamp": time.Stamp,
139+
"StampMilli": time.StampMilli,
140+
"StampMicro": time.StampMicro,
141+
"StampNano": time.StampNano,
142+
"DateTime": "2006-01-02 15:04:05",
143+
"DateOnly": "2006-01-02",
144+
"TimeOnly": "15:04:05",
145+
}
146+
147+
for name, layout := range layouts {
148+
fmt.Printf("%-12s : %s\n", name, now.Format(layout))
149+
}
150+
151+
fmt.Println("\n-- UTC 格式化 --")
152+
for name, layout := range layouts {
153+
fmt.Printf("%-12s : %s\n", name, now.UTC().Format(layout))
154+
}
155+
}
156+
~~~
157+
158+
输出结果:
159+
160+
~~~
161+
=== RUN TestName
162+
ANSIC : Sat Sep 6 14:03:17 2025
163+
UnixDate : Sat Sep 6 14:03:17 CST 2025
164+
RubyDate : Sat Sep 06 14:03:17 +0800 2025
165+
RFC822Z : 06 Sep 25 14:03 +0800
166+
RFC850 : Saturday, 06-Sep-25 14:03:17 CST
167+
RFC1123Z : Sat, 06 Sep 2025 14:03:17 +0800
168+
RFC3339 : 2025-09-06T14:03:17+08:00
169+
RFC3339Nano : 2025-09-06T14:03:17.9708592+08:00
170+
Kitchen : 2:03PM
171+
Stamp : Sep 6 14:03:17
172+
StampNano : Sep 6 14:03:17.970859200
173+
DateTime : 2025-09-06 14:03:17
174+
DateOnly : 2025-09-06
175+
TimeOnly : 14:03:17
176+
Layout : 09/06 02:03:17PM '25 +0800
177+
RFC822 : 06 Sep 25 14:03 CST
178+
RFC1123 : Sat, 06 Sep 2025 14:03:17 CST
179+
StampMilli : Sep 6 14:03:17.970
180+
StampMicro : Sep 6 14:03:17.970859
181+
182+
-- UTC 格式化 --
183+
UnixDate : Sat Sep 6 06:03:17 UTC 2025
184+
RubyDate : Sat Sep 06 06:03:17 +0000 2025
185+
RFC822Z : 06 Sep 25 06:03 +0000
186+
RFC850 : Saturday, 06-Sep-25 06:03:17 UTC
187+
RFC1123Z : Sat, 06 Sep 2025 06:03:17 +0000
188+
RFC3339 : 2025-09-06T06:03:17Z
189+
RFC3339Nano : 2025-09-06T06:03:17.9708592Z
190+
Kitchen : 6:03AM
191+
Stamp : Sep 6 06:03:17
192+
StampNano : Sep 6 06:03:17.970859200
193+
DateTime : 2025-09-06 06:03:17
194+
DateOnly : 2025-09-06
195+
TimeOnly : 06:03:17
196+
Layout : 09/06 06:03:17AM '25 +0000
197+
RFC822 : 06 Sep 25 06:03 UTC
198+
RFC1123 : Sat, 06 Sep 2025 06:03:17 UTC
199+
StampMilli : Sep 6 06:03:17.970
200+
StampMicro : Sep 6 06:03:17.970859
201+
ANSIC : Sat Sep 6 06:03:17 2025
202+
--- PASS: TestName (0.01s)
203+
PASS
204+
~~~
205+

0 commit comments

Comments
 (0)