解析奇怪的日期格式

5

我正在开发一个解析器,用于解析游戏日志文件,以便我可以对游戏内的拍卖进行分析。然而,记录器编写的日期格式似乎会导致问题,因为该格式似乎是专门为记录器编写的。例如,时间戳看起来像这样:[Wed Nov 23 23:26:10 2016] 我尝试使用以下代码进行解析:

func (r *AuctionReader) extractSaleInformation(line string) {
    fmt.Println("Extracting information from: ", line)

    // Format mask for output
    layout := "DD-MM-YYYY hh:mm:ss"

    // Replace the square brackets so we're just left with the date-time string
    date := strings.TrimSpace(strings.Replace((strings.Split(line, "]")[0]), "[", "", -1))

    fmt.Println(time.Parse(date, layout))
}

当我尝试解析上面的日期时间字符串时,我会得到以下错误:
0001-01-01 00:00:00 +0000 UTC parsing time "DD-MM-YYYY hh:mm:ss" as "Wed Nov 23 23:26:10 2016": cannot parse "DD-MM-YYYY hh:mm:ss" as "Wed Nov"
我该如何让解析器识别这个看起来自定义的格式?由于我想单独查询时间戳,我将把这些数据保存到Mongo中,因此不希望将拍卖时间存储为字符串。
1个回答

14
Golang以独特的方式处理所有日期格式-它使用参考时间 Mon Jan 2 15:04:05 MST 2006 (01/02 03:04:05PM'06 -0700)来显示用于格式化/解析给定时间/字符串的模式。因此,要读取格式“Wed Nov 23 23:26:10 2016”,您需要将参考日期放入该格式:“Mon Jan 2 15:04:05 2006”,然后执行:
t, _ := time.Parse("Mon Jan 2 15:04:05 2006", "Wed Nov 23 23:26:10 2016")

然后,为了按照给定格式输出它,如果你想要格式DD-MM-YYYY hh:mm:ss,你需要将参考时间放入该格式中:02-01-2006 15:04:05,然后执行:

t.Format("02-01-2006 15:04:05")

https://play.golang.org/p/VO5413Z7-z

因此,基本上主要的变化是

// Format mask for output
layout := "DD-MM-YYYY hh:mm:ss"

应该是

// Format mask for output
layout := "02-01-2006 15:04:05"

并且

time.Parse(date, layout)

应该是

time.Parse(layout, date)

另一个“主要更改”将是交换 time.Parse 中的 datelayout 参数。 - Gavin
感谢指出布局必须具有特定值。我一直在想为什么它不起作用,读了Time.Prase()的文档,也没有找到任何明确的提示表明如果传入错误的布局值,它将无法正常工作。 - kwiat1990

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接