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_ssy 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.
También en la biblioteca
migrate en Go: guía completa con ejemplos prácticos
SnapKit para Swift: guía completa con ejemplos
Cliente HTTP para Go (Golang): mejores bibliotecas para trabajar con la red
Métricas de Prometheus en Rust: bibliotecas prometheus y metrics-exporter-prometheus