Trabajo con fechas y horas en C++: nivel avanzado

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 avanzado con fechas y horas en C++: de chrono a los husos horarios

\n\n

Trabajar con fechas y horas es una de las tareas clave en el desarrollo de sistemas de alta carga, registro de eventos, aplicaciones financieras y planificadores. En C++, la biblioteca estándar ofrece un potente conjunto de herramientas, desde simples time_t hasta el moderno <chrono>. En este artículo, analizaremos técnicas avanzadas: mediciones precisas, husos horarios, formato y cálculos de intervalos.

\n\n

1. Biblioteca chrono: duration, time_point y clocks

\n\n

La biblioteca estándar <chrono> (C++11 y posteriores) proporciona tipos para representar momentos en el tiempo (time_point), duraciones (duration) y relojes (clock). Esto permite escribir código independiente de la plataforma.

\n\n
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n    using namespace std::chrono;\n\n    // Tomamos el tiempo de inicio\n    auto start = high_resolution_clock::now();\n\n    // Simulación de trabajo\n    std::this_thread::sleep_for(milliseconds(500));\n\n    auto end = high_resolution_clock::now();\n\n    // Calculamos la duración\n    auto duration = duration_cast<milliseconds>(end - start);\n    std::cout << "Transcurrido: " << duration.count() << " ms\\n";\n\n    // Trabajo con duration en diferentes unidades\n    seconds sec(1);\n    milliseconds ms = sec; // conversión implícita (sin pérdidas)\n    // milliseconds ms2 = duration_cast<milliseconds>(sec); // explícita\n    std::cout << "1 segundo = " << ms.count() << " ms\\n";\n\n    return 0;\n}
\n\n

Puntos clave:

\n
    \n
  • duration_cast — conversión entre unidades (puede perder precisión).
  • \n
  • high_resolution_clock — el reloj más preciso (generalmente una envoltura del temporizador del sistema).
  • \n
  • system_clock — hora del sistema, vinculada al calendario.
  • \n
  • steady_clock — reloj monótono, ideal para medir intervalos.
  • \n
\n\n

2. Hora del sistema y conversión a fechas de calendario

\n\n

Para trabajar con fechas de calendario (año, mes, día), use system_clock y las funciones to_time_t / from_time_t. A partir de C++20, aparecieron herramientas más convenientes, pero consideraremos el enfoque clásico.

\n\n
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n    using namespace std::chrono;\n\n    // Hora actual del sistema\n    auto now = system_clock::now();\n    std::time_t now_c = system_clock::to_time_t(now);\n\n    // Convertimos a hora local\n    std::tm* local = std::localtime(&now_c);\n    std::cout << "Hora local: " \n              << std::put_time(local, "%Y-%m-%d %H:%M:%S") << "\\n";\n\n    // Creamos un time_point a partir de una fecha de calendario (C++20 lo simplificará)\n    std::tm date = {};\n    date.tm_year = 2025 - 1900; // años desde 1900\n    date.tm_mon = 3;            // abril (0-11)\n    date.tm_mday = 15;\n    date.tm_hour = 12;\n    date.tm_min = 30;\n    date.tm_sec = 0;\n    std::time_t date_c = std::mktime(&date);\n    auto date_point = system_clock::from_time_t(date_c);\n\n    // Diferencia en días\n    auto diff = duration_cast<hours>(now - date_point).count() / 24;\n    std::cout << "Días desde el 15.04.2025: " << diff << "\\n";\n\n    return 0;\n}
\n\n

Importante: std::put_time está disponible desde C++11. Los especificadores de formato son similares a strftime.

\n\n

3. Husos horarios y C++20

\n\n

Antes de C++20, trabajar con husos horarios era complicado. En C++20, apareció la biblioteca <chrono> con soporte para time_zone y zoned_time. Si su compilador admite C++20 (GCC 12+, Clang 15+, MSVC 2022 17.4+), puede usar

Blogs

Book Recommendations