|
| 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