Ir – Analisando cadeias de data / hora que não são formatos ‘padrão’

Como faço para analisar cadeias de data / hora não padrão no Go. No exemplo, se eu quisesse converter a string 10/15/1983 em um time.Time ? A function time.Parse() supostamente permite que você especifique um formato.

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) } 

Isso resulta em pânico.

panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"

Logicamente isso faz sentido porque é como saber qual é o dia e qual é o mês.

Outros idiomas têm uma function semelhante à seguinte:

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

Eu não consigo encontrar essa function nos documentos Go, é a minha única escolha para regex?

Existem alguns valores-chave que o time.Parse está procurando.

Mudando:

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

para

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

o analisador irá reconhecê-lo.

Aqui está o código modificado no playground .

 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) } 

Você pode utilizar a lista de constantes no arquivo src / pkg / time / format.go para criar seus próprios formatos de análise.

 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 ) 

Portanto, sempre que o formato especificar um ano, ele deverá ser feito com “06” ou “2006”, os segundos especificados por “05” ou “5” e os fusos horários especificados em “MST”, “Z0700”, “Z07: 00”. “,” -0700 “,” -07 “ou” -07: 00 “. Se você fizer referência à lista de constantes, provavelmente poderá reunir qualquer formato padrão que precise analisar.

Por exemplo, se você quiser analisar a data / hora no Formato de Log Comum , o formato que o Apache usa para seus arquivos de log, você faria isso passando a seguinte cadeia para time.Parse() como o argumento de layout .

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

“02” indica o campo do dia do mês, “Jan” indica o campo do nome do mês, “2006” indica o campo do ano, “15” indica o campo da hora do dia no formato de 24 horas, “04” indica o campo de minutos, “05” indica o campo de segundos e “-0700” indica o campo de fuso horário.

Esse formato iria analisar o tempo atual do PST: 31/Dec/2012:15:32:25 -0800

Então a chamada time.Parse() seria assim:

 test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800") 

Se você não consegue lembrar os números no layout de especificação (“2006-01-02T15: 04: 05.000Z”), você pode usar minha biblioteca de formatação de data simples github.com/metakeule/fmtdate que usa convenções do MS Excel, como Y , M, D, he traduz internamente para o formato numérico:

 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) }