Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 4 de 539/50 en el curso~12 min
Lecciones del módulo (4/5)

El paquete time

El paquete time modela tres conceptos distintos: instantes (time.Time), duraciones (time.Duration) y herramientas periódicas (temporizador, ticker). Distinguirlos es crucial: un instante es un punto en la línea de tiempo, una duración es un intervalo.

time.Time - instantes

Go
now := time.Now()                // current instant in the local timezone
utc := now.UTC()                 // same instant in UTC
later := now.Add(2 * time.Hour)  // add a duration
diff := later.Sub(now)           // 2h0m0s (it's a Duration)

fmt.Println(now.Year(), now.Month(), now.Day())
fmt.Println(now.Weekday())

time.Time es inmutable: todos los métodos Add, Truncate, Round devuelven un nuevo Time.

Para comparar instantes utilice Before, After, Equal. No utilice == si los instantes pueden tener diferentes zonas horarias/relojes monótonos.

time.Duration — intervalos

Go
d := 250 * time.Millisecond
fmt.Println(d)         // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)

const timeout = 5 * time.Second

time.Duration es un alias de int64 que cuenta nanosegundos. Las constantes time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour son de tipo Duration.

Análisis y formato: el diseño de referencia

Go no utiliza cadenas como YYYY-MM-DD. Utiliza un instante de referencia canónico:

Code
Mon Jan 2 15:04:05 MST 2006

es decir, 01/02 03:04:05PM '06 -0700. Al memorizar este diseño (mnemónico: 1-2-3-4-5-6-7) puedes formatear cualquier fecha:

Go
const layout = "2006-01-02 15:04:05"
s := time.Now().Format(layout)            // "2026-05-16 14:30:00"
t, err := time.Parse(layout, "2026-05-16 14:30:00")

Stdlib ofrece diseños listos para usar: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

Go
fmt.Println(time.Now().Format(time.RFC3339))

Medir el tiempo

Go
start := time.Now()
work()
elapsed := time.Since(start)  // = time.Now().Sub(start)
fmt.Println("ci ha messo", elapsed)

time.Since utiliza el reloj monótono: no se ve perturbado por los ajustes del reloj del sistema (NTP, horario de verano). Para mediciones de rendimiento, eso es lo que desea.

Temporizador y teletipo

  • time.After(d) devuelve un chan time.Time que recibe sólo una vez después de d. Útil en select:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) es una variante detenible (t.Stop()).
  • time.NewTicker(d) envía repetidamente cada d. Recuerde defer ticker.Stop() para evitar fugas de rutina.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Ejercicios

Ejercicio#go.m8.l4.e1
Intentos: 0Cargando...

Imprime el instante actual formateado según la hora.RFC3339.

Cargando editor...

Solución disponible después de 3 intentos

Ejercicio#go.m8.l4.e2
Intentos: 0Cargando...

Mida cuánto tiempo lleva usar el tiempo de suspensión de 10 ms. Desde entonces e imprima el resultado.

Cargando editor...

Solución disponible después de 3 intentos

Cuestionario#go.m8.l4.e3
Listo

¿De qué tipo es la constante `time.Second`?

Go
d := time.Second
// d ha tipo ???
Opciones de respuesta