Introducción al trabajo con fechas y horas en Rust
Trabajar con fechas y horas es una de las tareas clave en cualquier aplicación moderna. Ya sea para registro de eventos, planificación de tareas, procesamiento de datos de usuario o trabajo con APIs — no se puede prescindir de una gestión correcta de las marcas de tiempo. En el lenguaje Rust, conocido por su rendimiento y seguridad, la biblioteca estándar proporciona solo un conjunto mínimo de herramientas para trabajar con el tiempo. Sin embargo, viene al rescate el potente crate chrono, que se ha convertido en el estándar de facto para trabajar con fechas y horas en el ecosistema Rust.
En este artículo, analizaremos en detalle cómo instalar y usar chrono, cómo crear, formatear, analizar y manipular fechas, así como cómo trabajar con husos horarios y marcas de tiempo Unix.
Instalación y vinculación del crate chrono
Para comenzar, es necesario agregar la dependencia chrono en el archivo Cargo.toml de tu proyecto:
[dependencies]chrono = "0.4"Después de esto, puedes importar los tipos y traits necesarios en el código:
use chrono::{DateTime, Utc, Local, NaiveDate, NaiveDateTime, Duration, Datelike, Timelike, TimeZone};El crate chrono ofrece varios tipos clave para representar fechas y horas:
NaiveDate— fecha sin hora ni huso horario (por ejemplo, 2024-01-15).NaiveTime— hora sin fecha ni huso horario (por ejemplo, 14:30:00).NaiveDateTime— combinación de fecha y hora sin considerar el huso horario.DateTime<Utc>— fecha y hora con huso horario UTC.DateTime<Local>— fecha y hora con el huso horario local del sistema.DateTime<FixedOffset>— fecha y hora con un desplazamiento arbitrario desde UTC.
Creación y obtención de la hora actual
La forma más sencilla de obtener el momento actual es usar las funciones Utc::now() y Local::now():
use chrono::{Utc, Local};
fn main() { let utc_now: DateTime<Utc> = Utc::now(); let local_now: DateTime<Local> = Local::now(); println!("Hora actual UTC: {}", utc_now); println!("Hora local actual: {}", local_now);}Para crear una fecha específica, puedes usar los métodos NaiveDate::from_ymd y NaiveDateTime::new:
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
fn main() { // Creación de la fecha 15 de marzo de 2024 let date = NaiveDate::from_ymd(2024, 3, 15); println!("Fecha: {}", date); // Creación de la hora 10:30:00 let time = NaiveTime::from_hms(10, 30, 0); println!("Hora: {}", time); // Combinación de fecha y hora let datetime = NaiveDateTime::new(date, time); println!("Fecha y hora: {}", datetime);}También se puede crear una fecha con huso horario usando el método and_hms de la fecha:
use chrono::{Utc, TimeZone};
fn main() { let datetime_utc = Utc.ymd(2024, 12, 25).and_hms(12, 0, 0); println!("Navidad UTC: {}", datetime_utc);}Formateo y análisis de fechas
Formateo de salida
Para convertir una fecha en una cadena se usa el método format, que acepta una cadena de formato. Los especificadores de formato son análogos a los del lenguaje Python y otros lenguajes:
use chrono::{Utc, DateTime};
fn main() { let now = Utc::now(); // Formateo básico println!("Por defecto: {}", now.format("%Y-%m-%d %H:%M:%S")); println!("Solo fecha: {}", now.format("%d.%m.%Y")); println!("Con nombre del mes: {}", now.format("%d %B %Y")); println!("Hora con segundos: {}", now.format("%H:%M:%S")); println!("Unix timestamp: {}", now.timestamp());}