Trabalho com datas e horas em C++: do A ao Z
Trabalhar com datas e horas é uma das tarefas básicas na programação. É necessário em todos os lugares: desde o registro de eventos até o cálculo de prazos e a criação de gráficos. Em C++, historicamente, essa área não era das mais convenientes, mas com a chegada do padrão C++11 e versões posteriores (C++14, C++17, C++20), a situação mudou drasticamente. Neste artigo, abordaremos todos os aspectos principais: desde as funções clássicas do C até a biblioteca moderna chrono, temporizadores, formatação e parsing. O material será útil tanto para iniciantes quanto para desenvolvedores experientes que desejam sistematizar seus conhecimentos.
1. Abordagem clássica: time_t e estrutura tm
Antes do surgimento do chrono, as principais ferramentas eram as funções de <ctime>. Essa abordagem ainda é relevante para dar suporte a código antigo e tarefas simples.
Funções principais:
time()— retorna a hora atual comotime_t(número de segundos desde 1º de janeiro de 1970).localtime()— convertetime_tpara a estruturatm(hora local).gmtime()— converte para UTC.strftime()— formatatmem uma string.mktime()— conversão inversa:tm→time_t.
#include <iostream>#include <ctime>
int main() { // Obtém a hora atual std::time_t now = std::time(nullptr);
// Converte para hora local std::tm* local_tm = std::localtime(&now);
// Formata em uma string char buffer[80]; std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_tm);
std::cout << "Hora atual: " << buffer << std::endl; return 0;}Desvantagens da abordagem:
- Funciona apenas com segundos (milissegundos e microssegundos não estão disponíveis).
- Não é seguro em ambientes multithread (use
localtime_rno POSIX). - A estrutura
tmcontém campos que são fáceis de confundir (ano deslocado em 1900, meses começando em 0). - Falta suporte para fusos horários e intervalos de tempo.
2. C++ moderno: biblioteca chrono (C++11 e posteriores)
A biblioteca chrono é uma ferramenta poderosa e type-safe para trabalhar com tempo. Ela está na base de todos os projetos C++ modernos.
Componentes principais:
- Relógios (clocks):
system_clock(hora do sistema),steady_clock(relógio monotônico para medições),high_resolution_clock(máxima resolução). - Pontos no tempo (time_point): vinculados a um relógio específico.
- Durações (duration): intervalos de tempo (segundos, milissegundos, nanossegundos).
#include <iostream>#include <chrono>#include <thread>
int main() { using namespace std::chrono;
// Momento atual auto now = system_clock::now();
// Converte para time_t para exibição std::time_t now_c = system_clock::to_time_t(now); std::cout << "Hora atual: " << std::ctime(&now_c);
// Medição do tempo de execução auto start = steady_clock::now(); std::this_thread::sleep_for(milliseconds(500)); // simula trabalho auto end = steady_clock::now();
auto duration = duration_cast<milliseconds>(end - start); std::cout << "Passaram: " << duration.count() << " ms" << std::endl;
return 0;}Vantagens do chrono:
- Alta precisão (nanossegundos).
- Type-safety (não é possível somar acidentalmente segundos com milissegundos).
- Suporte para aritmética (adição/subtração de durações e pontos no tempo).