Trabajo con fechas en C++: revisión de las mejores 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++: resumen de bibliotecas clave



Trabajar con fechas y horas es una de las tareas fundamentales en programación. En C++, la biblioteca estándar durante mucho tiempo estuvo limitada a utilidades de C (<ctime>), que son incómodas e inseguras en términos de tipos. A partir de C++11 y especialmente C++20, la situación cambió radicalmente. En este artículo, examinaremos tres enfoques principales para trabajar con fechas en C++ moderno.



1. Biblioteca estándar <chrono> (C++11 y C++20)



A partir de C++11, se incorporó a la biblioteca estándar el encabezado <chrono>, que proporciona relojes seguros en cuanto a tipos, puntos en el tiempo (time_point) y duraciones (duration). En C++20, la biblioteca se amplió con soporte para tipos de calendario (año, mes, día) y zonas horarias.



Componentes principales:

  • std::chrono::system_clock — reloj del sistema, vinculado al tiempo real.
  • std::chrono::steady_clock — reloj monótono para medir intervalos.
  • std::chrono::duration — intervalo de tiempo (por ejemplo, segundos, milisegundos).
  • std::chrono::time_point — un punto en el tiempo.
  • Tipos de calendario (C++20): year_month_day, hh_mm_ss y otros.


#include <iostream>#include <chrono>#include <format> // C++20

int main() { using namespace std::chrono;

// Hora actual auto now = system_clock::now(); std::cout << "Hora actual: " << now << "";

// Conversión a fecha de calendario (C++20) auto dp = floor<days>(now); year_month_day ymd{dp}; std::cout << "Año: " << (int)ymd.year() << "";

// Medición de intervalo auto start = steady_clock::now(); // ... algún código ... auto end = steady_clock::now(); auto diff = end - start; std::cout << "Transcurrido: " << duration_cast<milliseconds>(diff).count() << " ms"; return 0;}


Ventajas: integrada en el estándar, segura en cuanto a tipos, en activo desarrollo.

Desventajas: para C++20 se requiere un compilador moderno (GCC 12+, Clang 14+, MSVC 2022).



2. Boost.DateTime



La biblioteca Boost.DateTime es una de las más antiguas y maduras para trabajar con fechas. Antes de la llegada de C++20, era el estándar de facto. Proporciona las clases boost::gregorian::date, boost::posix_time::ptime y soporte completo para zonas horarias.



Funcionalidades principales:

  • Calendario gregoriano con soporte para años bisiestos.
  • Manipulación de fechas: suma de días, meses, años.
  • Formateo y análisis mediante boost::date_time::date_facet.
  • Soporte de zonas horarias a través de boost::local_time.


#include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>

int main() { using namespace boost::gregorian; using namespace boost::posix_time;

// Creación de fecha date d(2024, 12, 25); std::cout << "Fecha: " << d << ""; // 2024-Dec-25

// Suma de días date next_week = d + days(7); std::cout << "En una semana: " << next_week << "";

// Diferencia entre fechas days diff = next_week - d; std::cout << "Diferencia: " << diff.days() << " días";

// Hora actual con precisión de segundos ptime now = second_clock::local_time(); std::cout << "Ahora: " << now << ""; return 0;}


Ventajas: probada por el tiempo, documentación extensa, funciona con C++98.

Recommendations