Trabajo con fechas y horas en C++: desde lo clásico hasta el estándar moderno
La gestión de fechas y horas es una de las tareas clave en el desarrollo de software. Ya sea para registro de eventos, cálculo de plazos, trabajo con temporizadores o análisis de datos — no se puede prescindir de un conjunto de herramientas fiable. En C++ existen varios enfoques para esto: desde la biblioteca clásica <ctime> hasta la moderna <chrono>, que apareció en C++11 y se amplió significativamente en C++20. En este artículo analizaremos los métodos principales para trabajar con fechas y horas, proporcionaremos ejemplos prácticos y mostraremos cómo evitar errores típicos.
1. Enfoque clásico: la biblioteca <ctime>
La biblioteca <ctime> llegó a C++ desde el lenguaje C. Proporciona herramientas simples pero limitadas para trabajar con el tiempo calendario. Los tipos principales son: std::time_t (un número entero de segundos desde el 1 de enero de 1970) y std::tm (una estructura con campos de año, mes, día, horas, minutos, segundos, etc.).
Ejemplo 1: Obtener la hora actual y formatearla
#include <iostream>#include <ctime>
int main() { // Obtenemos la hora actual std::time_t now = std::time(nullptr); // Convertimos a hora local std::tm* local = std::localtime(&now); // Mostramos en formato "AAAA-MM-DD HH:MM:SS" char buffer[80]; std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local); std::cout << "Hora actual: " << buffer << std::endl; return 0;}Funciones principales de <ctime>:
std::time()— devuelve la hora calendario actual.std::localtime()— conviertetime_ten una estructuratmque representa la hora local.std::gmtime()— lo mismo, pero para UTC (Tiempo Universal Coordinado).std::mktime()— conversión inversa: detmatime_t.std::difftime()— calcula la diferencia en segundos entre dos momentos en el tiempo.std::strftime()— formatea la fecha y hora en una cadena según una plantilla dada.
Desventajas: la biblioteca no tiene en cuenta las zonas horarias (excepto local y UTC), no admite alta precisión (solo segundos), y la estructura tm no es segura en cuanto a tipos (por ejemplo, el año se cuenta desde 1900, el mes de 0 a 11).
2. Estándar moderno: la biblioteca <chrono> (C++11 y posteriores)
A partir de C++11, se agregó a la biblioteca estándar <chrono> — una biblioteca segura en cuanto a tipos y de alta precisión para trabajar con el tiempo. Opera con tres conceptos principales: duración (duration), punto en el tiempo (time_point) y reloj (clock).
Tipos de reloj:
std::chrono::system_clock— tiempo del sistema, vinculado al calendario (se puede convertir atime_t).std::chrono::steady_clock— reloj monótono, ideal para medir intervalos (no está sujeto a ajustes).std::chrono::high_resolution_clock— reloj con la máxima resolución disponible (a menudo es sinónimo de steady_clock).
Ejemplo 2: Medición del tiempo de ejecución de una operación
#include <iostream>#include <chrono>#include <thread>
int main() { // Marcamos el inicio auto start = std::chrono::steady_clock::now(); // Simulación de trabajo std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Marcamos el final auto end = std::chrono::steady_clock::now(); // Calculamos la diferencia auto duration = end - start;