Trabalho com datas em C++: visão geral das principais bibliotecas
Gerenciar datas e horas é uma das tarefas fundamentais no desenvolvimento de qualquer aplicação séria. Desde o registro de eventos até o cálculo de intervalos de tempo e agendamento de tarefas — o C++ oferece ao desenvolvedor várias ferramentas poderosas. Neste artigo, examinaremos três abordagens principais: a biblioteca padrão moderna std::chrono, a extensão de Howard Hinnant (parcialmente incorporada ao C++20) e a consagrada Boost.DateTime.
1. Biblioteca padrão: std::chrono (C++11 e posteriores)
A partir do C++11, trabalhar com tempo na biblioteca padrão tornou-se significativamente mais conveniente. std::chrono fornece tipos para representar momentos no tempo (time_point), durações (duration) e relógios (clock). No entanto, até o C++20, não havia meios convenientes para trabalhar com datas de calendário (dia, mês, ano).
Componentes principais:
- Relógios (Clocks):
system_clock(tempo do sistema),steady_clock(tempo monotônico para medições),high_resolution_clock(geralmente um alias de um dos primeiros). - Durações (Durations):
std::chrono::seconds,milliseconds,microseconds, etc. Permitem realizar operações aritméticas. - Momentos no tempo (Time points): Vinculação de uma duração a um ponto de referência específico (época) do relógio.
Exemplo: medindo o tempo de execução
#include <iostream>#include <chrono>#include <thread>
int main() { auto start = std::chrono::high_resolution_clock::now(); std::this_thread::sleep_for(std::chrono::milliseconds(500)); auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "Tempo de execução: " << duration.count() << " ms"; return 0;}Este código demonstra uma medição precisa do tempo com precisão de milissegundos. Para trabalhar com datas de calendário no C++20, surgiram novas possibilidades, mas se você estiver usando um padrão mais antigo, as bibliotecas a seguir serão úteis.
2. Biblioteca "date" de Howard Hinnant (predecessora do C++20)
Antes do lançamento do C++20, Howard Hinnant criou a biblioteca date, que se tornou o padrão de facto para trabalhar com datas de calendário. Ela é leve, não requer Boost e funciona sobre std::chrono. Grande parte de sua funcionalidade foi incorporada ao C++20, mas a biblioteca ainda é relevante para projetos que usam C++11/14/17.
Principais recursos:
- Tipos
year_month_day,year_month,weekday. - Parsing de datas a partir de strings (
parse). - Formatação de datas (
format). - Adição/subtração de dias, meses, anos.
- Suporte a fusos horários (extensão
tz.h).
Exemplo: trabalhando com datas
#include <iostream>#include <date/date.h>#include <chrono>
int main() { using namespace date; using namespace std::chrono; // Criando uma data: 15 de março de 2025 auto d1 = 2025_y / March / 15; std::cout << "Data: " << d1 << ""; // Adicionando 30 dias auto d2 = d1 + days{30}; std::cout << "Daqui a 30 dias: " << d2 << ""; // Diferença em dias auto diff = (d2 - d1).count(); std::cout << "Diferença: " << diff << " dias"; // Obtendo a data atual auto today = floor<days>(system_clock::now()); std::cout << "Hoje: " << year_month_day{today} << ""; return 0;}Esta
Também na biblioteca
Geração de PDF em JavaScript: biblioteca pdf-lib
Playwright para JavaScript (Node.js): guia completo com exemplos
Processamento de imagens em C#: redimensionar e cortar com a biblioteca ImageSharp