Analizando la cadena de fecha y hora RFC-3339/ISO-8601 en Go

Resuelto kannanrbk asked hace 10 años • 0 respuestas

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?

kannanrbk avatar Sep 15 '14 16:09 kannanrbk
Aceptado

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?).

RickyA avatar Sep 15 '2014 09:09 RickyA

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

robstarbuck avatar May 28 '2017 23:05 robstarbuck

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 .

VonC avatar Sep 15 '2014 10:09 VonC

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

Loren Osborn avatar Aug 19 '2018 08:08 Loren Osborn

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); 
}
Nishant Rawat avatar Feb 18 '2018 15:02 Nishant Rawat