You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:42:44