Golang时间格式化返回错误结果问题排查
问题根源:Go time.Format的参考时间规则理解错误
你犯的核心错误是没搞懂Go语言time.Format的工作机制——它不是用通用占位符(比如%H:%M:%S),而是靠固定的「参考时间」来映射格式,这个参考时间是:Mon Jan 2 15:04:05 MST 2006
每一段数字对应时间的固定单位:
2006→ 年01→ 月02→ 日15→ 24小时制小时04→ 分钟05→ 秒
你的格式化字符串写的是"2006-01-02 15:03:04",这里的03对应参考时间里的月份(Jan是1月,对应01),04对应参考时间里的分钟,完全搞混了分钟和秒的位置,所以输出的时间才会错位。
修正方案
1. 直接分别格式化日期和时间(更高效,无需拆分字符串)
转换时区后,直接使用对应格式字符串提取日期和时间:
// 转换时区逻辑不变 loc, err := time.LoadLocation("America/Los_Angeles") if err != nil { return err } t = t.In(loc) // 直接格式化日期和时间 dateStr := t.Format("2006-01-02") timeStr := t.Format("15:04:05") fmt.Println(dateStr) // 输出预期日期 fmt.Println(timeStr) // 输出预期时间
2. 若要保留合并格式化再拆分的方式,修正格式字符串
把时间部分改成15:04:05即可:
format := "2006-01-02 15:04:05" timestamp := t.Format(format) timestampSlice := strings.Fields(timestamp) fmt.Println(timestampSlice[0]) // 日期 fmt.Println(timestampSlice[1]) // 正确时间
测试用例验证
- 第一个测试输入:
time.Date(2021, time.Month(2), 21, 1, 10, 30, 0, time.UTC)
转换到洛杉矶时区(UTC-8)后是2021-02-20 17:10:30,用正确格式输出后,日期为2021-02-20,时间为17:10:30,符合预期。 - 第二个测试输入:
time.Date(2022, time.Month(8), 26, 22, 7, 30, 0, time.FixedZone("Asia/Shanghai", 0))
注意这里的FixedZone偏移量设为0,实际是UTC时区,转换到洛杉矶时区后是2022-08-26 06:07:30,输出结果符合预期。
内容的提问来源于stack exchange,提问作者HerbertRedford
相关产品推荐
相关产品推荐

