去 – parsing不是“标准”格式的date/时间string

如何parsingGo中的非标准date/时间string? 例如,如果我想将string10/15/1983转换成10/15/1983time.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/"

从逻辑上讲,这是有道理的,因为它应该如何知道哪一天是哪一天,哪一天是月份。

其他语言的function类似于以下内容:

parse("mm/dd/yyyy", "10/15/1983")

在Go文档中我找不到这样的函数,是我唯一的正则expression式select?

有一些关键的价值,时间,皮尔正在寻找。

通过改变:

 test, err := time.Parse("10/15/1983", "10/15/1983") 

 test, err := time.Parse("01/02/2006", "10/15/1983") 

parsing器会识别它。

这里是操场上的修改代码 。

 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文件中的常量列表来创build您自己的分析格式。

 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“。 如果你引用常量列表,你可能会把你需要parsing的标准格式放在一起。

例如,如果要使用通用日志格式 (Apache日志文件格式)parsingdate/时间,则可以通过将以下string传递给time.Parse()作为布局参数来实现。

 "02/Jan/2006:15:04:05 -0700" 

“02”表示月份的date字段,“Jan”表示月份名称字段,“2006”表示年份字段,“15”表示24小时格式的date字段,“04”表示分钟字段, “05”表示秒字段,“-0700”表示时区字段。

该格式将parsing当前的PST时间: 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") 

如果您不记得指定布局(“2006-01-02T15:04:05.000Z”)中的数字,您可以使用我的简单date格式库github.com/metakeule/fmtdate使用MS Excel约定,如Y ,M,D,h,并在内部将它们转换为数字格式:

 package main import ( "github.com/metakeule/fmtdate" "fmt" ) func main() { test, err := fmtdate.Parse("MM/DD/YYYY", "10/15/1983") if err != nil { panic(err) } fmt.Println(test) }