¡Cuidado con el estándar de fecha y hora! Golang tomado de la búsqueda de imágenes de Google Entonces, la historia de hoy trata sobre el comportamiento extraño al desarmar DateTime de JSON en Golang. No digo que esto sea un error, pero esta es solo mi historia debido a mi falta de experiencia al tratar con DateTime y la zona horaria en Golang. Sucede cuando quiero hacer un sistema API CRUD en Golang. Entonces, tengo un punto final, digamos: que recibirá un objeto de evento de JSON. /event { : , : , : } "title" "title here in string" "place" "place name here in string" "start_time" "date time here in string" Estoy usando como mi biblioteca de enrutamiento para facilitarme el manejo de mi solicitud. Con echo, para recibir el cuerpo de la respuesta y descomponerlo en mi estructura, puedo hacerlo con un código simple como el siguiente: labstack/echo package main ( ) type Event struct { Title string Place string StartTime time.Time CreatedAt time.Time UpdatedAt time.Time } func CreateEvent(c echo.Context) error { := (Event) err := c.Bind(&e) err != nil { err } now := time.Now() e.CreatedAt = now e.UpdatedAt = now c.JSON(http.StatusCreated, e) } func main() { := echo.New() e.POST( , CreateEvent) err := e.Start( ); err != nil { log.Fatal(err) } } import "log" "net/http" "time" "github.com/labstack/echo" `json:"title"` `json:"place"` `json:"start_time"` `json:"created_at"` `json:"updated_at"` e new if return // Other code here // .... // Store to DB // ... return e "/event" if ":9090" Entonces, cuando quiero probarlo, hice el cuerpo de la solicitud como se muestra a continuación, simplemente lo copié y lo pegué de nuestro ejemplo de documentación de la API. Porque al principio, ni siquiera creo que importe. { : , : , : } "title" "Core i13 Anniversarry" "place" "Ancol Beach" "start_time" "2018-09-22T12:42:31Z" La API ya se implementó en el servidor de ensayo, así que la pruebo directamente desde Postman al servidor de ensayo. Pero después de obtener todo el elemento de evento almacenado, start_time es diferente a lo que publiqué en el cuerpo de la solicitud. Se vuelve así a continuación. { : , : , : , : , : , : } "id" "1" // auto increment from database "title" "Core i13 Anniversarry" "place" "Ancol Beach" "start_time" "2018-09-22T19:42:31+07:00" "created_at" "2018-09-22T16:35:08+07:00" "updated_at" "2018-09-22T16:35:08+07:00" Y en la base de datos se almacenó así: Mira el campo. Cambió de lo que publiqué. Lo que quiero es que los datos almacenados sean los que publiqué desde Postman. start_time mismos Descubrí que el problema ocurre debido a la zona horaria, obviamente. Así que solo necesito cuidar la zona horaria. Fue lo primero que pensé. Creo que mis sistemas tienen un error sobre esto. Resolviendo el Problema Para solucionar este problema, estoy haciendo todas estas acciones a continuación. Buscando la cadena de conexión en el controlador de conexión Debido a que estoy usando MySQL como mi base de datos de almacenamiento, necesito un controlador para conectar mi aplicación con MySQL. Estoy usando como mi controlador de conexión. Entonces, después de buscar la documentación y verificar mi cadena de conexión, no sucedió nada malo. Lo hice correctamente. github.com/go-sql-driver/mysql dsn := root:root@tcp( : )/event?parseTime= &loc=Asia% FJakarta&charset=utf8mb4&collation=utf8mb4_unicode_ci 127.0 .0 .1 3306 true 2 Reconstruir la fecha y hora manualmente Todavía curioso, por qué sucede esto. Luego, estoy tratando de encontrar preguntas o respuestas o problemas sobre esto en StackOverflow o incluso en GitHub. Para ser honesto, me toma hasta 2 horas intentar solucionar este problema 🤦 Hasta entonces, me frustré. Entonces tengo 2 opciones para resolver esto. Reconstruiré start_time antes de almacenarlo en la base de datos. Preguntaré a mis compañeros de equipo (* incluso se siente tan tonto cuando pregunto esto de todos modos🤦) Pero, solo quiero esforzarme más 😶, arreglé la reconstrucción de DateTime. startTime := e.StartTime loc, := time.LoadLocation( ) localStartTime := time.Date(startTime.Year(), startTime.Month(), startTime.Day(), startTime.Hour(), startTime.Minute(), startTime.Second(), startTime.Nanosecond(), loc) _ "Asia/Jakarta" Luego, solo por curiosidad, le pregunto a mi equipo sobre el problema. Luego miran cómo lo reproduzco, igual que yo, también tienen curiosidad por qué sucede esto. Hasta que apenas unos minutos, uno de mi equipo encontró las razones por las que esto está sucediendo. Esto sucede porque hice un desplazamiento de zona horaria incorrecto en el cuerpo de mi solicitud. { : , : , : } "title" "Core i13 Anniversarry" "place" "Ancol Beach" "start_time" "2018-09-22T12:42:31Z" // look for the `Z` indicator Debido a que viví en la zona horaria +7.00 (Asia/Yakarta), debería incluirse en mi JSON. Entonces, cuando cambio el de: start_time T12: : <strong>Z</strong> 2018 -09 -22 42 31 dentro T12: : <strong>+ : </strong> 2018 -09 -22 42 31 07 00 resuelve mi problema No le pasó nada malo a mi sistema. Todo funciona perfectamente. Cuando me di cuenta de esto, me siento tan tonto 🤦. He gastado mis dos horas de mi vida para nada 🤦. Lección a ser aprendida Siempre pregunta primero a tus compañeros de equipo (si estuvieran disponibles de todos modos) es el formato , cada carácter es importante. 2018–09–22T12:42:31+07:00 RFC 3339 Si crees que vale la pena leer este artículo, dale un aplauso o compártelo en tu círculo de red, para que todos también puedan leerlo. ¡Sígueme para más historias como esta!