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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:07:40