Trabalho com datas e horas em C++: do A ao Z — guia completo

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 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 como time_t (número de segundos desde 1º de janeiro de 1970).
  • localtime() — converte time_t para a estrutura tm (hora local).
  • gmtime() — converte para UTC.
  • strftime() — formata tm em 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_r no POSIX).
  • A estrutura tm conté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).

Blogs

Book Recommendations