如何在 Go 中解析非标准日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.Time? 该time.Parse()函数应该允许您指定格式。
10/15/1983
time.Time
time.Parse()
http://play.golang.org/p/v5DbowXt1x
package main import "fmt" import "time" func main() { test, err := time.Parse("10/15/1983", "10/15/1983") if err != nil { panic(err) } fmt.Println(test) }
这导致恐慌。
panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"
从逻辑上讲,这是有道理的,因为它应该如何知道哪一天是哪月。
其他语言有类似下面的功能:
parse("mm/dd/yyyy", "10/15/1983")
我在 Go 文档中找不到这样的函数,是我唯一的正则表达式选择吗?
time.Parse 正在寻找一些关键值。
通过改变:
test, err := time.Parse("10/15/1983", "10/15/1983")
到
test, err := time.Parse("01/02/2006", "10/15/1983")
解析器会识别它。
这是操场上修改后的代码。
package main import "fmt" import "time" func main() { test, err := time.Parse("01/02/2006", "10/15/1983") if err != nil { panic(err) } fmt.Println(test) }
您可以利用src/pkg/time/format.go文件中的常量列表来创建您自己的解析格式。
const ( stdLongMonth = "January" stdMonth = "Jan" stdNumMonth = "1" stdZeroMonth = "01" stdLongWeekDay = "Monday" stdWeekDay = "Mon" stdDay = "2" stdUnderDay = "_2" stdZeroDay = "02" stdHour = "15" stdHour12 = "3" stdZeroHour12 = "03" stdMinute = "4" stdZeroMinute = "04" stdSecond = "5" stdZeroSecond = "05" stdLongYear = "2006" stdYear = "06" stdPM = "PM" stdpm = "pm" stdTZ = "MST" stdISO8601TZ = "Z0700" // prints Z for UTC stdISO8601ColonTZ = "Z07:00" // prints Z for UTC stdNumTZ = "-0700" // always numeric stdNumShortTZ = "-07" // always numeric stdNumColonTZ = "-07:00" // always numeric )
因此,无论何时您的格式指定年份,都应使用“06”或“2006”完成,秒由“05”或“5”指定,时区指定为“MST”、“Z0700”、“Z07:00” “、”-0700”、”-07” 或 “-07:00”。如果您引用常量列表,您可能会将需要解析的任何标准格式放在一起。
例如,如果您想解析Common Log Format 中的日期/时间,即 Apache 用于其日志文件的格式,您可以通过将以下字符串time.Parse()作为布局参数传递给来实现。
"02/Jan/2006:15:04:05 -0700"
“02”表示月份字段,“Jan”表示月份名称字段,“2006”表示年份字段,“15”表示24小时格式的小时字段,“04”表示分钟字段, “05”表示秒字段,“-0700”表示时区字段。
该格式将解析当前的 PST 时间: 31/Dec/2012:15:32:25 -0800
31/Dec/2012:15:32:25 -0800
所以time.Parse()调用看起来像这样:
test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800")