Fecha y Hora

Algunos contenidos de esta tradución pueden estar desactualizados.
Varios parches fueron aplicados a la lección original desde la última actualización.

Trabajando con tiempos en Elixir.

Tabla de contenidos

Hora(Time)

Elixir tiene algunos módulos que trabajan con tiempo. Aunque es necesario notar que esta funcionalidad está limitada a trabajar con la zona horaria UTC.

Empecemos obteniendo la hora actual:

iex> Time.utc_now
~T[19:39:31.056226]

Observa que también tenemos un sigilo que puede ser usado para crear una estructura Time:

iex> ~T[19:39:31.056226]
~T[19:39:31.056226]

Puedes aprender más acerca de los sigilos en la lección acerca de los sigilos. Es fácil acceder a partes de esta estructura:

iex> t = ~T[19:39:31.056226]
~T[19:39:31.056226]
iex> t.hour
19
iex> t.minute
39
iex> t.day
** (KeyError) key :day not found in: ~T[19:39:31.056226]

Pero hay un problemita: como te habrás dado cuenta, esta estructura sólo contine la hora del día, no hay datos acerca del día, mes o año.

Fecha(Date)

Al contrario de Time, la estructura Date tiene información acerca de la fecha actual, sin información acerca de la hora.

iex> Date.utc_today
~D[2028-10-21]

Pero tiene algunas funciones útiles para trabajar con fechas:

iex> {:ok, date} = Date.new(2020, 12,12)
{:ok, ~D[2020-12-12]}
iex> Date.day_of_week date
6
iex> Date.leap_year? date
true

day_of_week/1 calcula que día de la semana fue una fecha dada. En este caso es sábado. leap_year?/1 verifica si es un año bisiesto. Otras funciones pueden ser encontradas en la documentación.

NaiveDateTime

En Elixir existen dos tipos de estructuras que contienen tanto la hora como la fecha al mismo tiempo. La primera es NaiveDateTime. Su desventaja es la falta de soporte para la zona horaria:

iex(15)> NaiveDateTime.utc_now
~N[2029-01-21 19:55:10.008965]

Pero tiene tanto la hora como el la fecha actuales, así que puedes jugar añadiéndole tiempo, por ejemplo:

iex> NaiveDateTime.add(~N[2018-10-01 00:00:14], 30)
~N[2018-10-01 00:00:44]

DateTime

La segunda, como habrás adivinado por el título de la sección es DateTime. No tiene las limitaciones observadas previamente ya que tiene tanto la fecha como la hora y soporta zonas horarias. Pero veamos lo que dice la documentación oficial acerca de las zonas horarias:

Te darás cuenta que este módulo sólo contiene funciones de conversión así como funciones que trabajan con UTC. Esto se debe a que una implementación correcta de Datetime requiere una base de datos de zonas horarias que no se provee como parte de Elixir.

Además, nota que puedes crear una instacia DateTime de una instancia NaiveDateTime sólo con proveer la zona horaria:

iex> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, #DateTime<2016-05-24 13:26:08.003Z>}

¡Eso es todo! Si quieres trabajar con otras funciones avanzadas quizás quieras ver la documentación para Time, Date, DateTime. También deberías considerar Timex yCalendar, poderosas librerías para trabajar con tiempo en Elixir.

Caught a mistake or want to contribute to the lesson? Edit this page on GitHub!