Golang time.Parse报hour out of range:为何同格式布局结果不同?
Go time.Parse布局字符串的核心逻辑解析
Go语言的time.Parse函数对布局字符串的要求,和你直觉里的“格式匹配”完全不一样——它不是让你写一个和目标时间格式一模一样的字符串,而是必须用Go固定的「参考时间片段」来对应目标时间的各个部分,这个参考时间是:Mon Jan 2 15:04:05 MST 2006(对应Unix时间戳1136239445)。
为什么用31 July 2023 21:06:36当布局会报错?
当你把这个字符串作为布局时,time.Parse会把其中的每个数值/文本当成参考时间的对应字段值:
- 它会认为
21是月份(参考时间里的月份位置是Jan,对应数字1); 06是日期(参考时间的日期是2);36是小时(参考时间的小时是15);
这就导致解析时把小时识别成了36,直接超出了0-23的合法范围,所以抛出hour out of range错误。
为什么02 January 2006 15:04:05能成功解析?
这个布局是严格对应参考时间片段的:
02→ 对应参考时间的日期(2号),匹配目标字符串的31;January→ 对应参考时间的月份(January),匹配目标的July;2006→ 对应参考时间的年份(2006),匹配2023;15→ 对应参考时间的24小时制小时(15点),匹配21;04→ 对应分钟,05→ 对应秒,分别匹配06和36;
每个位置的格式都和参考时间的片段一一对应,所以能正确解析目标时间。
示例代码
package main import ( "fmt" "time" ) func main() { targetTimeStr := "31 July 2023 21:06:36" // 错误的布局尝试 _, err := time.Parse("31 July 2023 21:06:36", targetTimeStr) if err != nil { fmt.Println("错误布局解析失败:", err) } // 正确的布局解析 parsedTime, err := time.Parse("02 January 2006 15:04:05", targetTimeStr) if err != nil { fmt.Println("正确布局解析失败:", err) } else { fmt.Println("解析成功结果:", parsedTime) } }
内容的提问来源于stack exchange,提问作者Dedy Puji
相关产品推荐
相关产品推荐

