Trabajo con fechas en C++: revisión de bibliotecas para manipulación del tiempo

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

Trabajo con fechas en C++: revisión de bibliotecas clave



La gestión de fechas y horas es una de las tareas fundamentales al desarrollar cualquier aplicación seria. Desde el registro de eventos hasta el cálculo de intervalos de tiempo y la planificación de tareas, C++ ofrece al desarrollador varias herramientas potentes. En este artículo, analizaremos tres enfoques principales: la biblioteca estándar moderna std::chrono, la extensión de Howard Hinnant (parcialmente incluida en C++20) y la probada Boost.DateTime.



1. Biblioteca estándar: std::chrono (C++11 y posteriores)



A partir de C++11, trabajar con el tiempo en la biblioteca estándar se volvió mucho más conveniente. std::chrono proporciona tipos para representar momentos en el tiempo (time_point), duraciones (duration) y relojes (clock). Sin embargo, hasta C++20 no tenía herramientas convenientes para trabajar con fechas de calendario (día, mes, año).



Componentes principales:

  • Relojes (Clocks): system_clock (hora del sistema), steady_clock (tiempo monótono para mediciones), high_resolution_clock (generalmente un alias de uno de los anteriores).
  • Duraciones (Durations): std::chrono::seconds, milliseconds, microseconds, etc. Permiten realizar operaciones aritméticas.
  • Momentos en el tiempo (Time points): Vinculación de una duración a un punto de inicio específico (época) del reloj.


Ejemplo: medición del tiempo de ejecución

#include <iostream>#include <chrono>#include <thread>

int main() { auto start = std::chrono::high_resolution_clock::now(); std::this_thread::sleep_for(std::chrono::milliseconds(500)); auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "Tiempo de ejecución: " << duration.count() << " ms"; return 0;}


Este código demuestra una medición precisa del tiempo con precisión de milisegundos. Para trabajar con fechas de calendario en C++20, aparecieron nuevas capacidades, pero si usas un estándar más antiguo, las siguientes bibliotecas te serán útiles.



2. Biblioteca "date" de Howard Hinnant (predecesora de C++20)



Antes del lanzamiento de C++20, Howard Hinnant creó la biblioteca date, que se convirtió en el estándar de facto para trabajar con fechas de calendario. Es liviana, no requiere Boost y funciona sobre std::chrono. Gran parte de su funcionalidad se incorporó en C++20, pero la biblioteca sigue siendo relevante para proyectos que usan C++11/14/17.



Funcionalidades principales:

  • Tipos year_month_day, year_month, weekday.
  • Análisis de fechas desde cadenas (parse).
  • Formateo de fechas (format).
  • Suma/resta de días, meses, años.
  • Soporte de zonas horarias (extensión tz.h).


Ejemplo: trabajo con fechas

#include <iostream>#include <date/date.h>#include <chrono>

int main() { using namespace date; using namespace std::chrono; // Creamos una fecha: 15 de marzo de 2025 auto d1 = 2025_y / March / 15; std::cout << "Fecha: " << d1 << ""; // Sumamos 30 días auto d2 = d1 + days{30}; std::cout << "En 30 días: " << d2 << ""; // Diferencia en días auto diff = (d2 - d1).count(); std::cout << "Diferencia: " << diff << " días"; // Obtenemos la fecha actual auto today = floor<days>(system_clock::now()); std::cout << "Hoy: " << year_month_day{today} << ""; return 0;}


Esta

Recommendations