Trabajo con fechas en Rust: resumen de bibliotecas clave
El ecosistema de Rust ofrece varias bibliotecas potentes para trabajar con fechas y horas. A diferencia de Python con su módulo integrado datetime, en Rust la biblioteca estándar solo proporciona una funcionalidad mínima (std::time::Instant y Duration), por lo que para tareas serias es necesario recurrir a crates externos. En este artículo, revisaremos tres bibliotecas principales: Chrono, Time y Jiff.
1. Chrono — el estándar de facto
Chrono es la biblioteca más popular (más de 100 millones de descargas). Proporciona un conjunto completo de herramientas para trabajar con fechas, horas, husos horarios y formato.
Funcionalidades principales:
NaiveDate,NaiveDateTime— fechas y horas sin huso horarioDateTime<Tz>— fecha-hora vinculada a un huso horario- Soporte para
Durationy operaciones aritméticas - Formateo mediante
format!y análisis de cadenas - Trabajo con calendarios (Gregoriano, ISO)
Ejemplo de código:
use chrono::{DateTime, Utc, NaiveDate, Duration};
fn main() { // Hora actual en UTC let now: DateTime<Utc> = Utc::now(); println!("Hora actual: {}", now.format("%Y-%m-%d %H:%M:%S"));
// Creación de una fecha específica let date = NaiveDate::from_ymd_opt(2025, 3, 15).unwrap(); println!("Fecha: {}", date);
// Aritmética con fechas let future = now + Duration::days(30); println!("En 30 días: {}", future.format("%d.%m.%Y"));
// Análisis de una cadena let parsed = "2025-01-01 12:00:00" .parse::<DateTime<Utc>>() .expect("Formato de fecha inválido"); println!("Parseado: {}", parsed);}Chrono es excelente para la mayoría de los proyectos, pero puede ser excesivo si solo se necesita funcionalidad básica.
2. Time — una alternativa moderna
El crate Time (desarrollador Jacob Pratt) se posiciona como un reemplazo más seguro y ergonómico para Chrono. Utiliza tipado estricto y evita panics en tiempo de ejecución.
Diferencias clave:
- Todas las operaciones devuelven
Result— sin panics ocultos - Sistema de tipos más estricto: tipos separados para fechas, horas, desplazamientos
- Soporte integrado para ISO 8601 y RFC 3339
- Menor tamaño y compilación más rápida
Ejemplo de código:
use time::{Date, Month, OffsetDateTime, Duration, format_description};
fn main() -> Result<(), time::Error> { // Hora actual let now = OffsetDateTime::now_utc(); println!("Ahora: {}", now);
// Creación de fecha (sin panic) let date = Date::from_calendar_date(2025, Month::March, 15)?; println!("Fecha: {}", date);
// Aritmética let week_later = now + Duration::weeks(1); println!("En una semana: {}", week_later);
// Análisis con formato explícito let format = format_description::parse("[year]-[month]-[day]")?; let parsed = Date::parse("2025-12-31", &format)?; println!("Parseado: {}", parsed); Ok(())}Time es una excelente opción para proyectos nuevos donde la seguridad y la previsibilidad son importantes.
3. Jiff — el jugador más reciente
Jiff (de BurntSushi, creador de regex y ripgrep) es la biblioteca más nueva (lanzamiento en 2024). Se centra en el trabajo con husos horarios y la internacionalización.
Características:
- Base de datos de husos horarios integrada (IANA)
- Soporte para calendarios no estándar (Islámico, Judío, etc.)
- Trabajo avanzado con intervalos y periodos
- Alto rendimiento gracias a cálculos perezosos