Trabalho com datas e horas em C++: nível avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalho avançado com datas e horas em C++: do chrono aos fusos horários

\n\n

Trabalhar com datas e horas é uma das tarefas principais no desenvolvimento de sistemas de alta carga, logging, aplicações financeiras e agendadores. Em C++, a biblioteca padrão oferece um conjunto poderoso de ferramentas, desde simples time_t até o moderno <chrono>. Neste artigo, abordaremos técnicas avançadas: medições precisas, fusos horários, formatação e cálculos de intervalos.

\n\n

1. Biblioteca chrono: duration, time_point e clocks

\n\n

A biblioteca padrão <chrono> (C++11 e posteriores) fornece tipos para representar momentos no tempo (time_point), durações (duration) e relógios (clock). Isso permite escrever código independente de plataforma.

\n\n
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n    using namespace std::chrono;\n\n    // Marca o tempo de início\n    auto start = high_resolution_clock::now();\n\n    // Simula trabalho\n    std::this_thread::sleep_for(milliseconds(500));\n\n    auto end = high_resolution_clock::now();\n\n    // Calcula a duração\n    auto duration = duration_cast<milliseconds>(end - start);\n    std::cout << "Passaram: " << duration.count() << " ms\\n";\n\n    // Trabalhando com duration em diferentes unidades\n    seconds sec(1);\n    milliseconds ms = sec; // conversão implícita (sem perdas)\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

Pontos-chave:

\n
    \n
  • duration_cast — conversão entre unidades (pode perder precisão).
  • \n
  • high_resolution_clock — relógio de máxima precisão (geralmente um wrapper sobre o temporizador do sistema).
  • \n
  • system_clock — hora do sistema, vinculada ao calendário.
  • \n
  • steady_clock — relógio monotônico, ideal para medições de intervalos.
  • \n
\n\n

2. Hora do sistema e conversão para datas do calendário

\n\n

Para trabalhar com datas do calendário (ano, mês, dia), use system_clock e as funções to_time_t / from_time_t. A partir do C++20, surgiram ferramentas mais convenientes, mas abordaremos a abordagem clássica.

\n\n
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n    using namespace std::chrono;\n\n    // Hora atual do sistema\n    auto now = system_clock::now();\n    std::time_t now_c = system_clock::to_time_t(now);\n\n    // Converte para 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    // Cria um time_point a partir de uma data do calendário (C++20 simplificará)\n    std::tm date = {};\n    date.tm_year = 2025 - 1900; // anos 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    // Diferença em dias\n    auto diff = duration_cast<hours>(now - date_point).count() / 24;\n    std::cout << "Dias desde 15/04/2025: " << diff << "\\n";\n\n    return 0;\n}
\n\n

Importante: std::put_time está disponível desde C++11. Os especificadores de formato são análogos aos do strftime.

\n\n

3. Fusos horários e C++20

\n\n

Antes do C++20, trabalhar com fusos horários era complicado. No C++20, surgiu a biblioteca <chrono> com suporte para time_zone e zoned_time. Se o seu compilador suporta C++20 (GCC 12+, Clang 15+, MSVC 2022 17.4+), você pode usar

Blogs

Book Recommendations