Analizando la cadena de fecha y hora RFC-3339/ISO-8601 en Go
Intenté analizar la cadena de fecha "2014-09-12T11:45:26.371Z"
en Go. Este formato de hora se define como:
- RFC-3339 fecha-hora
- ISO-8601 fecha-hora
Código
layout := "2014-09-12T11:45:26.371Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout , str)
Recibí este error:
tiempo de análisis "2014-11-12T11:47:39.489Z": mes fuera de rango
¿Cómo puedo analizar esta cadena de fecha?
Utilice los números de diseño exactos que se describen aquí y una bonita publicación de blog aquí .
entonces:
layout := "2006-01-02T15:04:05.000Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout, str)
if err != nil {
fmt.Println(err)
}
fmt.Println(t)
da:
>> 2014-11-12 11:45:26.371 +0000 UTC
Lo sé. Alucinante. También me pilló la primera vez. Go simplemente no usa una sintaxis abstracta para los componentes de fecha y hora ( YYYY-MM-DD
), sino estos números exactos ( creo que la hora de la primera confirmación de go No, según esto . ¿Alguien lo sabe?).
Como se respondió, pero para ahorrar escritura "2006-01-02T15:04:05.000Z"
para el diseño, puede usar la constante RFC3339 del paquete .
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(time.RFC3339, str)
if err != nil {
fmt.Println(err)
}
fmt.Println(t)
https://play.golang.org/p/Dgu2ZvHwTh
El diseño a utilizar se " 2006-01-02T15:04:05.000Z
" describe en efecto en la respuesta de RickyA .
No es "el momento del primer compromiso", sino más bien una forma mnemotécnica de recordar dicho diseño.
Ver paquete/hora :
El tiempo de referencia utilizado en los diseños es:
Mon Jan 2 15:04:05 MST 2006
que es tiempo Unix
1136239445
.
Dado que MST es GMT-0700, la hora de referencia se puede considerar como
01/02 03:04:05PM '06 -0700
(1,2,3,4,5,6,7, siempre que recuerdes que 1 es para el mes y 2 para el día, lo cual no es fácil para un europeo como yo, acostumbrado al formato de fecha día-mes)
Como se ilustra en " time.parse: ¿por qué golang analiza la hora incorrectamente? ", ese diseño (usando 1,2,3,4,5,6,7) debe respetarse exactamente .
Esto es bastante tarde para la fiesta y realmente no digo nada que no se haya dicho ya de una forma u otra, principalmente a través de los enlaces anteriores, pero quería dar un resumen de TL;DR a aquellos con menos capacidad de atención:
La fecha y hora de la cadena de formato go es muy importante. Así es como Go sabe qué campo es cuál. Generalmente son del 1 al 9 de izquierda a derecha de la siguiente manera:
- Enero / enero / enero / enero / 01 / _1 (etc.) son para el mes
- 02/_2 son para el día del mes
- 15 / 03 / _3 / PM / P / pm /p son para hora y meridiano (3pm)
- 04/_4 son por minutos
- 05/_5 son por segundos
- 2006/06 son para el año
- -0700/07:00/MST son para zona horaria
- .999999999 / .000000000, etc. son para segundos parciales (creo que la distinción es si se eliminan los ceros finales)
- Lun / Monday son el día de la semana (que en realidad era el 01-02-2006),
Por lo tanto, no escriba "01-05-15" como formato de fecha, a menos que desee "Mes-Segundo-Hora".
(... nuevamente, esto fue básicamente un resumen de lo anterior).
Sugeriré usar la constante time.RFC3339 del paquete time. Puede consultar otras constantes del paquete de tiempo. https://golang.org/pkg/time/#pkg-constants
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("Time parsing");
dateString := "2014-11-12T11:45:26.371Z"
time1, err := time.Parse(time.RFC3339,dateString);
if err!=nil {
fmt.Println("Error while parsing date :", err);
}
fmt.Println(time1);
}