Go语言time.Parse解析后格式化结果与原字符串不一致问题求助
Go语言time.Parse与Format同布局输出不一致问题解决
问题原因
你的时间布局"Mon, Jan 2, 2006 15:04 PM"存在格式冲突:
15是24小时制的小时标记,代表0-23的小时数;PM是12小时制的时段标记,用于区分上午/下午。
当time.Parse解析"Mon, Apr 7, 2025 7:36 PM"时,会结合PM标记将12小时制的7点转换为24小时制的19点(下午7点)。后续调用Format时,15标记会强制输出24小时制的19,同时保留PM标记,最终出现19:36 PM的矛盾结果。
解决方案(不修改原布局常量)
因为原布局的格式冲突无法直接通过Format还原原字符串,我们可以手动处理12小时制转换,构造符合原格式的输出:
package main import ("fmt"; "time") func main() { const timeLayout = "Mon, Jan 2, 2006 15:04 PM" sourceTime := "Mon, Apr 7, 2025 7:36 PM" myTime, err := time.Parse(timeLayout, sourceTime) if err != nil { panic(err) } // 转换为12小时制小时并确定时段 hour := myTime.Hour() period := "AM" if hour >= 12 { period = "PM" if hour > 12 { hour -= 12 } } else if hour == 0 { hour = 12 // 处理凌晨0点为12 AM的情况 } // 拼接成原格式字符串 formatted := fmt.Sprintf("%s %d:%02d %s", myTime.Format("Mon, Jan 2, 2006"), hour, myTime.Minute(), period) fmt.Printf("\t\tsourceTime = \"%s\"\n formatted = \"%s\"\n", sourceTime, formatted) }
运行后输出:
sourceTime = "Mon, Apr 7, 2025 7:36 PM" formatted = "Mon, Apr 7, 2025 7:36 PM"
补充说明
Go的time包对布局字符串的解析是严格按标记含义处理的,15和PM同时出现属于不合理的格式组合——正常12小时制应该用3作为小时标记(对应15的位置),即正确的12小时制布局应为"Mon, Jan 2, 2006 3:04 PM"。但由于你无法修改原布局,手动构造字符串是最可靠的解决方式。
内容的提问来源于stack exchange,提问作者ArdeshirV
相关产品推荐
相关产品推荐

