Trabalho com datas em C++: visão geral das 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



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

Recommendations