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_sse 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.
Também na biblioteca
Tokens JWT em JavaScript (Node.js): Guia Completo
Validação de dados em Swift (iOS/macOS): melhores práticas e ferramentas
Swift CLI com ArgumentParser: criando ferramentas de console poderosas
Geração de PDF em C# (.NET): Visão geral de bibliotecas e ferramentas