time - sobre - Ir-Cadenas de fecha/hora de análisis que no son formatos "estándar"
series de netflix pdf (2)
¿Cómo puedo analizar cadenas de fecha / hora no estándar en Go? Por ejemplo, si quisiera convertir la cadena 10/15/1983
en una time.Time
¿ time.Time
? La función time.Parse()
supuestamente le permite especificar un 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)
}
Esto resulta en pánico.
panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"
Lógicamente eso tiene sentido porque cómo se supone saber cuál es el día y cuál es el mes.
Otros idiomas tienen una función similar a la siguiente:
parse("mm/dd/yyyy", "10/15/1983")
No puedo encontrar tal función en los documentos de Go, ¿es mi única opción regex?
Hay algunos valores clave que el tiempo.Parse está buscando.
Cambiando:
test, err := time.Parse("10/15/1983", "10/15/1983")
a
test, err := time.Parse("01/02/2006", "10/15/1983")
el analizador lo reconocerá.
Aquí está el código modificado en el patio de recreo .
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)
}
Puede utilizar la lista de constantes en el archivo src/pkg/time/format.go para crear sus propios formatos de análisis.
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
)
Por lo tanto, cada vez que su formato especifique un año, debe hacerlo con "06" o "2006", los segundos se especifican mediante "05" o "5" y las zonas horarias se especifican en "MST", "Z0700", "Z07: 00 "," -0700 "," -07 "o" -07: 00 ". Si hace referencia a la lista de constantes, probablemente pueda armar cualquier formato estándar que necesite analizar.
Por ejemplo, si desea analizar la fecha / hora en el formato de registro común , el formato que Apache utiliza para sus archivos de registro, lo haría pasando la siguiente cadena a time.Parse()
como argumento de diseño .
"02/Jan/2006:15:04:05 -0700"
"02" indica el campo del día del mes, "Jan" indica el campo del nombre del mes, "2006" indica el campo del año, "15" indica el campo de la hora del día en formato de 24 horas, "04" indica el campo de minutos, "05" denota el campo de segundos y "-0700" denota el campo de zona horaria.
Ese formato analizaría la hora actual de PST: 31/Dec/2012:15:32:25 -0800
Entonces la llamada time.Parse()
se vería así:
test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800")
Si no puede recordar los Números en el diseño específico ("2006-01-02T15: 04: 05.000Z"), puede usar mi biblioteca de formato de fecha simple github.com/metakeule/fmtdate que utiliza las convenciones de MS Excel, como Y , M, D, h y los traduce internamente al formato de número:
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)
}