Hoy vamos a trabajar con fechas en Go. Te enseñaré a sumar y restar fechas con todo y horas, minutos y segundos de modo que podremos trabajar con horas o con fechas completas.
De este modo vamos a poder operar desde nanosegundos hasta milenios (teóricamente). Veamos cómo hacerlo usando las funciones de time
.
Obteniendo la fecha en Go
Para poder sumar y restar fechas en Go debemos tener un objeto de tipo time.Time
, ya sea a través de time.Now
o parseando una fecha como cadena.
Es decir, si vas a operar con la fecha y hora actual entonces obtenla con time.Now
. En caso de que quieras trabajar con fechas del futuro o del pasado, primero debes parsearlas con time.Parse.
En los ejemplos yo usaré la fecha y hora actual al momento de escribir el post en formato YYYY-MM-DDTHH:MM:SS
en donde la T
es una simple letra literal T
(por ejemplo, 2021-10-21T22:12:53
).
Por cierto, si no entiendes lo del formato te recomiendo leer el post de parsear las fechas con Go.
fecha := "2021-10-21T22:12:53"
fechaComoTime, err := time.Parse("2006-01-02T15:04:05", fecha)
if err != nil {
fmt.Println("Error parseando fecha")
fmt.Println(err)
return
}
// Hasta aquí todo bien
fmt.Println("Fecha original: ")
fmt.Println(fechaComoTime)
Sumar hora a una fecha
Ahora veamos cómo sumar fechas en Go. Veamos cómo sumarle una hora, por ejemplo. Para ello invocamos a Add
pasándole el tiempo que se va a sumar.
En este caso como solo es una hora entonces multiplicamos time.Hour
por 1
. La multiplicación no es necesaria (ya que al multiplicar por 1, el resultado es el mismo) pero lo hago para que el código sea explicativo.
dentroDeUnaHora := fechaComoTime.Add(time.Hour * 1)
fmt.Println("Fecha dentro de una hora: ")
fmt.Println(dentroDeUnaHora)
Como puedes ver, esto nos devuelve igualmente un time.Time
al que podemos seguir agregando o restando tiempo.
Por cierto, también tenemos disponible time.Nanosecond, Microsecond, Millisecond, Second, Minute y Hour. Ya si quieres trabajar con días, semanas y meses debes hacer las multiplicaciones necesarias.
Sumar días
Por ejemplo veamos cómo trabajar con días. Solo hay que multiplicar la hora por 24
, y luego multiplicar el resultado por el número de días (que en este caso serían 57
):
dentroDe57Dias := fechaComoTime.Add(time.Hour * 24 * 57)
fmt.Println("Fecha dentro de 57 días:")
fmt.Println(dentroDe57Dias)
Restar tiempo a una fecha en Go
Ya vimos cómo sumar tiempo a una fecha, ahora veamos cómo restar tiempo a una fecha en Go. Para ello simplemente hay que volver negativo el resultado, y seguir invocando a Add
.
Es decir, es como sumar un número negativo; al hacerlo lo que realmente logras es una resta.
haceDosDias := fechaComoTime.Add((time.Hour * 24 * 2) * -1)
fmt.Println("Fecha hace dos días")
fmt.Println(haceDosDias)
En este caso son dos días. Primero multiplicamos la hora por 48
, y finalmente multiplicamos eso por -1
para hacerlo negativo.
Poniendo todo junto
El código completo que imprime los resultados queda así:
package main
import (
"fmt"
"time"
)
func main() {
/*
https://parzibyte.me/blog
*/
fecha := "2021-10-21T22:12:53"
fechaComoTime, err := time.Parse("2006-01-02T15:04:05", fecha)
if err != nil {
fmt.Println("Error parseando fecha")
fmt.Println(err)
return
}
// Hasta aquí todo bien
fmt.Println("Fecha original: ")
fmt.Println(fechaComoTime)
dentroDeUnaHora := fechaComoTime.Add(time.Hour * 1)
fmt.Println("Fecha dentro de una hora: ")
fmt.Println(dentroDeUnaHora)
haceDosDias := fechaComoTime.Add((time.Hour * 24 * 2) * -1)
fmt.Println("Fecha hace dos días")
fmt.Println(haceDosDias)
dentroDe57Dias := fechaComoTime.Add(time.Hour * 24 * 57)
fmt.Println("Fecha dentro de 57 días:")
fmt.Println(dentroDe57Dias)
}
Obviamente puedes trabajar con cualquier precisión, desde Nanosegundos hasta miles de años. Y luego puedes formatear la fecha, extraer los meses, días, etcétera.
Todo es cuestión de adaptar el código para lo que necesites. Si quieres puedes probar el código en este enlace.
También te dejo con más tutoriales de Go por aquí.