Trabalho com datas e horas em C++: guia completo sobre chrono

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

Trabalhando com datas e horas em C++: de <ctime> ao moderno <chrono>



Trabalhar com datas e horas é uma das tarefas principais em qualquer aplicação séria: de logs e backups a temporizadores e cálculos financeiros. Em C++, historicamente, existem duas abordagens: a clássica no estilo C através do arquivo de cabeçalho <ctime> e a moderna, type-safe, através da biblioteca <chrono>, que surgiu no C++11 e foi significativamente expandida no C++20. Neste artigo, abordaremos ambos os métodos, aprenderemos a obter a hora atual, medir intervalos, formatar datas e evitar erros típicos.



1. Método clássico: <ctime> e std::time_t



Antes do C++11, a única maneira padrão de trabalhar com tempo eram as funções do C: time(), localtime(), strftime(). Esta abordagem ainda é usada em código legado e tarefas simples.



Obtendo a hora atual

A função std::time(nullptr) retorna o número de segundos desde 1º de janeiro de 1970 (época Unix) como um número inteiro std::time_t.



#include <iostream>#include <ctime>

int main() { std::time_t now = std::time(nullptr); std::cout << "Hora atual (seg desde a época): " << now << std::endl; return 0;}


Convertendo para um formato legível

Para obter uma estrutura com componentes (ano, mês, dia, horas, etc.), use std::localtime() ou std::gmtime().



#include <iostream>#include <ctime>

int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);

std::cout << "Ano: " << (local->tm_year + 1900) << std::endl; std::cout << "Mês: " << (local->tm_mon + 1) << std::endl; std::cout << "Dia: " << local->tm_mday << std::endl; return 0;}


Formatando string com strftime

A função std::strftime() permite formatar a data em uma string de forma flexível de acordo com um modelo fornecido.



#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 << "Data e hora atuais: " << buffer << std::endl; return 0;}


⚠️ Importante: std::localtime() e std::gmtime() retornam um ponteiro para um buffer estático — isso não é thread-safe. No C++11, surgiram versões reentrantes localtime_s (Windows) ou localtime_r (POSIX).



2. C++ moderno: biblioteca <chrono>



A biblioteca <chrono> oferece tipagem estrita, trabalho com diferentes unidades de tempo e alta precisão. Os componentes principais são:

  • Relógios (clocks): system_clock, steady_clock, high_resolution_clock
  • Pontos no tempo (time_point): vinculação a um momento específico
  • Durações (duration): intervalos de tempo (segundos, milissegundos, etc.)


Obtendo o momento atual

#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 atual: " << std::ctime(&now_time); return 0;}


Medindo intervalos de tempo (temporizador)

Uma das tarefas mais comuns é medir o tempo de execução do código. Para isso, é ideal us

Blogs

Book Recommendations