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
También en la biblioteca
Trabajo con archivos ZIP en Swift (iOS/macOS): guía completa
Caching en C# (.NET): Redis, MemoryCache y otras soluciones
Frameworks CLI para PHP: Symfony Console y Laravel Zero — guía completa
node-schedule — planificador de tareas para TypeScript