Go y Golang

Go: sumar y restar tiempo a fecha

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

Sumar y restar tiempo a fechas con Go

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

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.