Trabajo con fechas y horas en Rust: de la A a la Z
Trabajar con fechas y horas es una de las tareas clave en el desarrollo de cualquier aplicación: desde servicios web hasta sistemas de registro. En Rust, conocido por su seguridad y rendimiento, el trabajo con fechas se implementa a través de la potente biblioteca chrono. En este artículo, analizaremos todos los aspectos del trabajo con fechas y horas: desde operaciones básicas hasta manipulaciones complejas con zonas horarias.
1. Instalación y configuración de la biblioteca chrono
La biblioteca chrono es el estándar de facto para trabajar con fechas y horas en Rust. Proporciona un conjunto completo de herramientas: desde objetos de fecha simples hasta tipos complejos que tienen en cuenta las zonas horarias.
Para comenzar, agregue la dependencia en el archivo Cargo.toml:
[dependencies]chrono = "0.4"Después de esto, importe los módulos necesarios en su código:
use chrono::{NaiveDate, NaiveDateTime, DateTime, Utc, Local, Duration};use chrono::format::ParseError;2. Tipos de datos principales para trabajar con fechas
En chrono existen varios tipos clave que cubren todas las necesidades del desarrollador:
NaiveDate— fecha sin hora ni zona horaria (por ejemplo, 2024-01-15).NaiveTime— hora sin fecha ni zona horaria (por ejemplo, 14:30:00).NaiveDateTime— combinación de fecha y hora sin zona horaria.DateTime<Tz>— fecha y hora con indicación de zona horaria (por ejemplo,DateTime<Utc>oDateTime<Local>).
Veamos un ejemplo de creación de objetos de cada tipo:
// Creación de NaiveDatelet date = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();println!("Fecha: {}", date); // 2024-01-15
// Creación de NaiveTimelet time = NaiveTime::from_hms_opt(14, 30, 0).unwrap();println!("Hora: {}", time); // 14:30:00
// Creación de NaiveDateTimelet datetime = NaiveDateTime::new(date, time);println!("Fecha y hora: {}", datetime); // 2024-01-15 14:30:00
// Creación de DateTime con zona horaria UTClet utc_datetime = Utc::now();println!("Hora actual UTC: {}", utc_datetime);
// Creación de DateTime con zona horaria locallet local_datetime = Local::now();println!("Hora local actual: {}", local_datetime);3. Formato y análisis de fechas
Una de las tareas más comunes es convertir fechas a cadenas y viceversa. chrono utiliza cadenas de formato similares a strftime de C.
Formato de fecha a cadena
Para formatear, use el método .format():
use chrono::Utc;
let now = Utc::now();
// Formato estándar ISO 8601println!("ISO 8601: {}", now.format("%Y-%m-%dT%H:%M:%S%z"));
// Formato en españolprintln!("Formato español: {}", now.format("%d.%m.%Y %H:%M"));
// Solo fechaprintln!("Solo fecha: {}", now.format("%A, %d %B %Y"));
// Salida:// ISO 8601: 2024-01-15T14:30:00+0000// Formato español: 15.01.2024 14:30// Solo fecha: Monday, 15 January 2024Especificadores de formato principales:
%Y— año (4 dígitos)%m— mes (01-12)%d— día (01-31)%H— horas (00-23)%M— minutos (00-59)%S— segundos (00-59)%z— desplazamiento de zona horaria%A— nombre completo del día de la semana%B— nombre completo del mes
Análisis de cadena a fecha
Para convertir una cadena en una fecha, use el método parse_from_str():
use chrono::NaiveDate;use chrono::format::ParseError;
fn parse_date(dat