Trabajo con fechas en C++: bibliotecas chrono, date.h y Boost.DateTime

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 modernas



Trabajar con fechas y horas es una de las tareas clave en el desarrollo de software. Durante mucho tiempo, C++ careció de un conjunto de herramientas estándar conveniente, lo que llevó al uso de funciones de C (ctime, localtime) o soluciones de terceros. Sin embargo, con la llegada del estándar C++11 y versiones posteriores, la situación cambió drásticamente. En este artículo, analizaremos tres enfoques principales para trabajar con fechas en C++: la biblioteca estándar std::chrono, la extensión date.h de Howard Hinnant y el potente framework Boost.DateTime.



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



std::chrono es parte de la biblioteca estándar de C++ que proporciona tipos para representar puntos en el tiempo (time_point), duraciones (duration) y relojes (clock). Es ideal para medir intervalos de tiempo, trabajar con temporizadores y retardos de alta precisión. Sin embargo, hasta C++20 no contaba con herramientas convenientes para trabajar con fechas de calendario (día, mes, año).



Ejemplo: medición del tiempo de ejecución del código

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

int main() { auto start = std::chrono::high_resolution_clock::now();

// Simulación de trabajo 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;}


Con C++20, std::chrono incorporó soporte para calendario: los tipos year, month, day, year_month_day y operadores para trabajar con ellos. Ahora se puede escribir:

#include <chrono>#include <iostream>

int main() { using namespace std::chrono; auto today = floor<days>(system_clock::now()); year_month_day ymd{today}; std::cout << int(ymd.year()) << "-" << unsigned(ymd.month()) << "-" << unsigned(ymd.day()) << ""; return 0;}


2. Biblioteca date.h (Howard Hinnant)



Antes del lanzamiento de C++20, los desarrolladores utilizaban activamente la biblioteca date.h, una extensión de un solo archivo para std::chrono escrita por Howard Hinnant. Proporciona un conjunto completo de funciones para trabajar con fechas: análisis sintáctico, formateo, cálculo de diferencias entre fechas, trabajo con husos horarios e incluso soporte para el calendario juliano.



Ejemplo: análisis sintáctico de una cadena a fecha

#include "date.h"#include <iostream>#include <sstream>

int main() { std::istringstream ss("2025-04-07"); date::sys_days tp; ss >> date::parse("%F", tp); // Formato ISO 8601 auto ymd = date::year_month_day{tp}; std::cout << "Año: " << int(ymd.year()) << ""; return 0;}


Ejemplo: cálculo de la edad

#include "date.h"#include <iostream>

int main() { using namespace date; auto birth = sys_days{year{1990}/month{1}/day{15}}; auto today = floor<days>(std::chrono::system_clock::now()); auto age = today - birth; std::cout << "Edad en días: " << age.count() << ""; // Edad en años (aproximadamente) auto years = duration_cast<std::chrono::years>(age); std::cout << "Edad en años: " << years.count() << ""; return 0;}


La biblioteca date.h es fácil de incluir (basta con copiar el archivo de cabecera) y no requiere compilación. Se convirtió en la base del std::chrono estándar en C++2

Recommendations