Introducción al trabajo con fechas y horas en Rust
Trabajar con fechas y horas es una de las tareas clave en la mayoría de las aplicaciones modernas. Ya sea para registro de eventos, cálculo de plazos, procesamiento de marcas de tiempo de APIs o trabajo con calendarios, no se puede prescindir de una biblioteca de calidad para trabajar con el tiempo. En el ecosistema de Rust, la biblioteca estándar solo proporciona capacidades básicas (std::time::Instant y std::time::Duration), que son adecuadas para medir el rendimiento, pero no para un trabajo completo con fechas de calendario.
En ayuda llega el crate chrono — el estándar de facto para trabajar con fechas y horas en Rust. Ofrece una amplia funcionalidad: desde la creación de fechas simples hasta el trabajo con zonas horarias, formato y aritmética. En este artículo, analizaremos en detalle las capacidades principales de chrono, proporcionaremos ejemplos prácticos y mostraremos cómo evitar errores típicos.
1. Instalación y tipos principales de chrono
Para comenzar, agregue la dependencia a su Cargo.toml:
[dependencies]chrono = "0.4"Después de esto, puede importar los tipos necesarios. Chrono ofrece tres tipos clave para representar fechas y horas:
NaiveDate— fecha sin hora (año, mes, día).NaiveDateTime— fecha y hora sin considerar la zona horaria.DateTime<Tz>— fecha y hora con zona horaria (por ejemplo,UtcoLocal).
Veamos un ejemplo simple de creación de estos tipos:
use chrono::{NaiveDate, NaiveDateTime, DateTime, Utc, Local};
fn main() { // Creamos una fecha naive (sin hora) let date = NaiveDate::from_ymd_opt(2025, 10, 15).unwrap(); println!("Fecha: {}", date);
// Creamos una hora naive (sin fecha) let time = NaiveTime::from_hms_opt(14, 30, 0).unwrap(); println!("Hora: {}", time);
// Combinamos en NaiveDateTime let naive_dt = NaiveDateTime::new(date, time); println!("Naive datetime: {}", naive_dt);
// Hora actual en UTC y local let now_utc: DateTime<Utc> = Utc::now(); let now_local: DateTime<Local> = Local::now(); println!("Ahora UTC: {}", now_utc); println!("Ahora local: {}", now_local);}Observe el uso de from_ymd_opt y from_hms_opt — devuelven Option, lo que protege contra la creación de fechas no válidas (por ejemplo, 32 de enero).
2. Formateo y análisis de fechas
Chrono utiliza un potente sistema de formato basado en especificadores, muy similar a strftime de C/PHP. Esto permite convertir fechas a cadenas y viceversa de manera flexible.
2.1 Formateo de fecha a cadena
use chrono::{Utc, DateTime};
fn main() { let now: DateTime<Utc> = Utc::now(); // ISO 8601 estándar println!("ISO: {}", now.to_rfc3339()); // Formato personalizado println!("Personalizado: {}", now.format("%Y-%m-%d %H:%M:%S")); println!("Día de la semana: {}", now.format("%A")); println!("Mes: {}", now.format("%B")); println!("Año-mes-día: {}", now.format("%d.%m.%Y"));}Especificadores de formato principales:
%Y— año (4 dígitos)%m— mes (01-12)%d— día del mes (01-31)%H— horas (00-23)%M— minutos (00-59)%S— segundos (00-60)%A— nombre completo del día de la semana%B— nombre completo del mes
2.2 Análisis de cadena a fecha
Para la conversión inversa se utiliza el método parse_from_str:
use chrono::{NaiveDateTime, DateTime, Utc, format::ParseResult};