C++ Academy · Aula

Calendário e fusos horários

Use os tipos de calendário do C++20

Aula 4 de 413 etapas

Calendário e fusos horários é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Tipos de calendário do C++20

O C++20 adicionou um suporte abrangente a calendários em <chrono>. Agora, você pode expressar anos, meses e dias diretamente como tipos, em vez de manipular números inteiros.

  • year, month, day
  • year_month_day para uma data completa
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year y{2026};
    std::cout << "Year value: " << static_cast<int>(y) << '\n';
    return 0;
}

Literais de calendário

Literais de calendário, como 2026y e 15d, além de meses nomeados, como std::chrono::May, tornam as datas mais naturais de ler.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto y = 2026y;
    auto d = 15d;
    std::cout << static_cast<int>(y) << " / " << static_cast<unsigned>(d) << '\n';
    return 0;
}

Construção de uma data

Combine as três partes com o operador / para formar um year_month_day. A ordem é ano, mês e dia.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year_month_day ymd = 2026y/May/30;
    std::cout << static_cast<int>(ymd.year()) << "-"
              << static_cast<unsigned>(ymd.month()) << "-"
              << static_cast<unsigned>(ymd.day()) << '\n';
    return 0;
}

Validação de datas

Um year_month_day sabe se representa uma data de calendário válida. Use ok() para rejeitar valores impossíveis, como 30 de fevereiro.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year_month_day good = 2026y/February/28;
    year_month_day bad = 2026y/February/30;
    std::cout << std::boolalpha << good.ok() << " " << bad.ok() << '\n';
    return 0;
}

Dias do sistema

Converta uma data para sys_days, uma contagem de dias desde a época. Isso permite fazer cálculos com dias e calcular diferenças entre datas.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    sys_days a = sys_days{2026y/May/30};
    sys_days b = sys_days{2026y/May/20};
    std::cout << "Days apart: " << (a - b).count() << '\n';
    return 0;
}

Cálculos com dias

Adicionar days{n} a um sys_days avança a data em n dias; depois, você pode convertê-la novamente para uma data de calendário.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    sys_days start = sys_days{2026y/May/30};
    sys_days later = start + days{10};
    year_month_day ymd = later;
    std::cout << static_cast<unsigned>(ymd.day()) << "/"
              << static_cast<unsigned>(ymd.month()) << '\n';
    return 0;
}

Dia da semana

Converta um sys_days para um weekday para descobrir em que dia da semana cai uma data.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    weekday wd{sys_days{2026y/May/30}};
    std::cout << "Weekday index (Sun=0): " << wd.c_encoding() << '\n';
    return 0;
}

Último dia de um mês

A marca especial last calcula o último dia de qualquer mês, tratando automaticamente os anos bissextos.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year_month_day_last eom = 2024y/February/last;
    year_month_day ymd = eom;
    std::cout << "Feb 2024 ends on day " << static_cast<unsigned>(ymd.day()) << '\n';
    return 0;
}

Verificação de ano bissexto

O tipo year disponibiliza is_leap(), para que você não precise se lembrar das regras de divisibilidade.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    std::cout << std::boolalpha;
    std::cout << "2024 leap: " << year{2024}.is_leap() << '\n';
    std::cout << "2026 leap: " << year{2026}.is_leap() << '\n';
    return 0;
}

De um ponto no tempo para uma data

Arredonde para baixo um ponto no tempo de system_clock até days e converta-o para um year_month_day para obter a data do calendário de hoje.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto today = floor<days>(system_clock::now());
    year_month_day ymd = sys_days{today};
    std::cout << "Year is in range: " << (static_cast<int>(ymd.year()) > 2000) << '\n';
    return 0;
}

Fusos horários

O C++20 também adiciona fusos horários por meio de std::chrono::zoned_time e do banco de dados da IANA. A disponibilidade depende da sua biblioteca padrão, mas o modelo associa um ponto no tempo a um fuso nomeado para exibir corretamente a hora local.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto now = system_clock::now();
    auto days_part = floor<days>(now);
    std::cout << "Have a UTC time point: " << (days_part.time_since_epoch().count() > 0) << '\n';
    return 0;
}

Verificação rápida

Verifique sua compreensão dos tipos de calendário do C++20.

Recapitulação

Você aprendeu sobre o suporte a calendários do C++20:

  • year, month, day e year_month_day com o construtor /
  • validação com ok() e verificações com is_leap()
  • sys_days para cálculos com dias e consulta do dia da semana
  • last para o fim do mês, além de uma introdução a zoned_time

Isso conclui o curso Tempo e a Biblioteca Chrono.

Grátis para começar

Aprenda C++ com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Calendário e fusos horários” é grátis?

Sim — o texto completo de “Calendário e fusos horários” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Calendário e fusos horários”?

Use os tipos de calendário do C++20 Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Calendário e fusos horários”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Durações e relógios
  2. Pontos no tempo
  3. Medição do desempenho do código
  4. Calendário e fusos horários
← Voltar para C++ Academy