Trabajo con fechas y horas en Rust: guía completa

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

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, Utc o Local).


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};                

Blogs

Book Recommendations