Trabajo con fechas y horas en C++: desde <ctime> hasta el moderno <chrono>
Trabajar con fechas y horas es una de las tareas clave en cualquier aplicación seria: desde registros y copias de seguridad hasta temporizadores y cálculos financieros. En C++ históricamente han existido dos enfoques: el clásico estilo C a través del archivo de cabecera <ctime> y el moderno enfoque con seguridad de tipos a través de la biblioteca <chrono>, que apareció en C++11 y se amplió significativamente en C++20. En este artículo analizaremos ambos métodos, aprenderemos a obtener la hora actual, medir intervalos, formatear fechas y evitar errores típicos.
1. Método clásico: <ctime> y std::time_t
Antes de C++11, la única forma estándar de trabajar con el tiempo eran las funciones de C: time(), localtime(), strftime(). Este enfoque todavía se utiliza en código heredado y tareas simples.
Obtener la hora actual
La función std::time(nullptr) devuelve la cantidad de segundos desde el 1 de enero de 1970 (época Unix) como un número entero std::time_t.
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::cout << "Hora actual (seg desde época): " << now << std::endl; return 0;}Conversión a formato legible
Para obtener una estructura con componentes (año, mes, día, horas, etc.), use std::localtime() o std::gmtime().
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);
std::cout << "Año: " << (local->tm_year + 1900) << std::endl; std::cout << "Mes: " << (local->tm_mon + 1) << std::endl; std::cout << "Día: " << local->tm_mday << std::endl; return 0;}Formateo de cadenas con strftime
La función std::strftime() permite formatear de manera flexible una fecha en una cadena según una plantilla dada.
#include <iostream>#include <ctime>
int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);
char buffer[80]; std::strftime(buffer, sizeof(buffer), "%d.%m.%Y %H:%M:%S", local); std::cout << "Fecha y hora actual: " << buffer << std::endl; return 0;}⚠️ Importante: std::localtime() y std::gmtime() devuelven un puntero a un buffer estático — esto no es seguro para hilos. En C++11 aparecieron versiones reentrantes localtime_s (Windows) o localtime_r (POSIX).
2. C++ moderno: biblioteca <chrono>
La biblioteca <chrono> ofrece tipado estricto, trabajo con diferentes unidades de tiempo y alta precisión. Componentes principales:
- Relojes (clocks):
system_clock,steady_clock,high_resolution_clock - Puntos en el tiempo (time_point): vinculación a un momento específico
- Duraciones (duration): intervalos de tiempo (segundos, milisegundos, etc.)
Obtener el momento actual
#include <iostream>#include <chrono>#include <ctime> // para std::time_t
int main() { auto now = std::chrono::system_clock::now(); std::time_t now_time = std::chrono::system_clock::to_time_t(now); std::cout << "Hora actual: " << std::ctime(&now_time); return 0;}Medición de intervalos de tiempo (temporizador)
Una de las tareas más comunes es medir el tiempo de ejecución del código. Para esto es ideal