Trabajo con fechas en Rust: revisión de bibliotecas para tiempo y calendario

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con fechas en Rust: bibliotecas para tiempo y calendario



Rust es un lenguaje de programación de sistemas moderno que ofrece tipado estricto y seguridad de memoria. Sin embargo, la biblioteca estándar de Rust proporciona solo herramientas mínimas para trabajar con fechas y horas. Para un trabajo completo con calendarios, zonas horarias, formato y cálculos, los desarrolladores utilizan crates de terceros. En este artículo, analizaremos en detalle las tres bibliotecas principales: chrono, time y jiff, y también proporcionaremos ejemplos prácticos.



1. Biblioteca chrono: el estándar de facto



chrono es la biblioteca más popular para trabajar con fechas en Rust. Proporciona una API rica para crear, manipular y formatear fechas y horas. Los tipos principales son: NaiveDate, NaiveDateTime, DateTime (con zona horaria) y Duration.



Instalación

# Cargo.toml[dependencies]chrono = "0.4"


Ejemplo: fecha y hora actual

use chrono::{Local, Utc};

fn main() { let now_utc = Utc::now(); let now_local = Local::now(); println!("UTC: {}", now_utc); println!("Local: {}", now_local);}


Ejemplo: análisis de cadena y formato

use chrono::NaiveDate;

fn main() { let date = NaiveDate::parse_from_str("2025-03-15", "%Y-%m-%d") .expect("Formato de fecha inválido"); println!("Día: {}", date.format("%d.%m.%Y"));}


Ventajas: gran comunidad, soporte de zonas horarias a través de chrono-tz, trabajo con intervalos y duraciones.



Desventajas: tamaño relativamente grande, complejidad al trabajar con calendarios no estándar.



2. Biblioteca time: una alternativa ligera



time es una biblioteca más moderna y ligera que se desarrolla activamente. Utiliza un sistema de tipos estricto para prevenir errores (por ejemplo, separación en Date, Time, OffsetDateTime y PrimitiveDateTime).



Instalación

[dependencies]time = "0.3"


Ejemplo: creación de fecha y cálculo de diferencia

use time::{Date, Month, Duration};

fn main() { let start = Date::from_calendar_date(2025, Month::March, 10).unwrap(); let end = Date::from_calendar_date(2025, Month::March, 20).unwrap(); let diff = end - start; println!("Diferencia: {} días", diff.whole_days());}


Ejemplo: formato

use time::OffsetDateTime;use time::format_description::well_known::Rfc3339;

fn main() { let now = OffsetDateTime::now_utc(); let formatted = now.format(&Rfc3339).unwrap(); println!("RFC 3339: {}", formatted);}


Ventajas: tamaño pequeño, separación clara de tipos, excelente documentación.



Desventajas: menos ejemplos en internet que chrono.



3. Biblioteca jiff: para intervalos de alta precisión



jiff es una biblioteca especializada para trabajar con intervalos de calendario y eventos recurrentes. Es útil para tareas de planificación, recordatorios y cálculo de días laborables.



Instalación

[dependencies]jiff = "0.1"


Ejemplo: creación de intervalo y verificación de pertenencia

use jiff::ZonedInterval;use jiff::tz::TimeZone;

fn main() { let tz = TimeZone::get("Europe/Moscow").unwrap(); let start = tz.to_zoned(2025, 3, 1, 0, 0, 0, 0).unwrap(); let end = tz.to_zoned(2025, 3, 31, 23, 59, 59, 0).unwrap(); let interval = ZonedInterval::new(start, end); let check = tz.to_zoned(2025, 3, 15, 12, 0, 0, 0).unwrap(); println!("¿El 15 de marzo está en el intervalo? {}", interval.contains(&check));}


Ventajas: conveniente para calend

Recommendations