Trabajo con fechas y horas en C++: guía completa sobre chrono

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 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

Blogs

Book Recommendations