Trabalho com datas em C++: visão geral das melhores bibliotecas para manipulação de tempo

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 em C++: visão geral das principais bibliotecas



Trabalhar com datas e horas é uma das tarefas fundamentais na programação. Em C++, a biblioteca padrão foi por muito tempo limitada a utilitários de C (<ctime>), que são inconvenientes e inseguros em termos de tipos. A partir de C++11 e especialmente C++20, a situação mudou drasticamente. Neste artigo, veremos três abordagens principais para trabalhar com datas em C++ moderno.



1. Biblioteca padrão <chrono> (C++11 e C++20)



A partir de C++11, o cabeçalho <chrono> foi incluído na biblioteca padrão, fornecendo relógios type-safe, pontos no tempo (time_point) e durações (duration). Em C++20, a biblioteca foi expandida com suporte para tipos de calendário (ano, mês, dia) e fusos horários.



Componentes principais:

  • std::chrono::system_clock — relógio do sistema, vinculado ao tempo real.
  • std::chrono::steady_clock — relógio monotônico para medir intervalos.
  • std::chrono::duration — intervalo de tempo (ex.: segundos, milissegundos).
  • std::chrono::time_point — um ponto no tempo.
  • Tipos de calendário (C++20): year_month_day, hh_mm_ss e outros.


#include <iostream>#include <chrono>#include <format> // C++20

int main() { using namespace std::chrono;

// Hora atual auto now = system_clock::now(); std::cout << "Hora atual: " << now << "";

// Conversão para data do calendário (C++20) auto dp = floor<days>(now); year_month_day ymd{dp}; std::cout << "Ano: " << (int)ymd.year() << "";

// Medição de intervalo auto start = steady_clock::now(); // ... algum código ... auto end = steady_clock::now(); auto diff = end - start; std::cout << "Passaram: " << duration_cast<milliseconds>(diff).count() << " ms"; return 0;}


Prós: integrada ao padrão, type-safe, em desenvolvimento ativo.

Contras: para C++20, requer um compilador moderno (GCC 12+, Clang 14+, MSVC 2022).



2. Boost.DateTime



A biblioteca Boost.DateTime é uma das mais antigas e maduras para trabalhar com datas. Antes do surgimento do C++20, era o padrão de facto. Fornece as classes boost::gregorian::date, boost::posix_time::ptime e suporte completo para fusos horários.



Principais recursos:

  • Calendário gregoriano com suporte para anos bissextos.
  • Manipulações com datas: adição de dias, meses, anos.
  • Formatação e parsing via boost::date_time::date_facet.
  • Suporte para fusos horários via boost::local_time.


#include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>

int main() { using namespace boost::gregorian; using namespace boost::posix_time;

// Criação de data date d(2024, 12, 25); std::cout << "Data: " << d << ""; // 2024-Dec-25

// Adição de dias date next_week = d + days(7); std::cout << "Daqui a uma semana: " << next_week << "";

// Diferença entre datas days diff = next_week - d; std::cout << "Diferença: " << diff.days() << " dias";

// Hora atual com precisão de segundos ptime now = second_clock::local_time(); std::cout << "Agora: " << now << ""; return 0;}


Prós: testada pelo tempo, documentação extensa, funciona com C++98.

Recommendations