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
También en la biblioteca
Trabajo con Markdown en Node.js: bibliotecas y herramientas para conversión
Caché en C++: Biblioteca Cache++
Trabajo con Excel en Java: Apache POI y alternativas
GraphQL Java — biblioteca del lado del servidor para implementar API GraphQL en Java
Caché en TypeScript: Redis y otras soluciones para Node.js