C++ Academy · Lezione

Calendario e fusi orari

Usare i tipi di calendario di C++20

Lezione 4 di 413 passaggi

Calendario e fusi orari è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Tipi di calendario C++20

C++20 ha aggiunto un supporto completo per i calendari a <chrono>. Ora potete rappresentare direttamente anni, mesi e giorni come tipi, invece di gestire manualmente degli interi.

  • year, month, day
  • year_month_day per una 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;
}

Literal del calendario

I literal del calendario come 2026y e 15d, insieme ai mesi denominati come std::chrono::May, rendono naturale la lettura delle date.

#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;
}

Creare una data

Combinate i tre elementi con l'operatore / per formare un year_month_day. L'ordine è anno, mese, giorno.

#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;
}

Convalidare le date

Un year_month_day sa riconoscere se rappresenta una data reale del calendario. Utilizzate ok() per rifiutare valori impossibili come il 30 febbraio.

#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;
}

sys_days

Convertite una data in sys_days, un conteggio dei giorni trascorsi dall'epoca. In questo modo potete eseguire calcoli sui giorni e determinare le differenze tra le date.

#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;
}

Calcoli sui giorni

Aggiungere days{n} a un sys_days fa avanzare la data di n giorni; in seguito potete riconvertirla in una data del calendario.

#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;
}

Giorno della settimana

Convertite un sys_days in un weekday per scoprire in quale giorno della settimana cade una 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;
}

Ultimo giorno del mese

Lo specificatore speciale last calcola l'ultimo giorno di qualsiasi mese, gestendo automaticamente gli anni bisestili.

#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;
}

Verificare gli anni bisestili

Il tipo year espone is_leap(), così non dovete ricordare personalmente le regole di divisibilità.

#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;
}

Da un punto temporale a una data

Arrotondate per difetto un punto temporale di system_clock a days e convertitelo in un year_month_day per ottenere la data del calendario odierna.

#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;
}

Fusi orari

C++20 aggiunge anche i fusi orari tramite std::chrono::zoned_time e il database IANA. La disponibilità dipende dalla libreria standard, ma questo modello associa un punto temporale a un fuso denominato per visualizzare correttamente l'ora locale.

#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 rapida

Verificate la vostra comprensione dei tipi di calendario C++20.

Riepilogo

Avete imparato a utilizzare il supporto ai calendari di C++20:

  • year, month, day e year_month_day con il costruttore /
  • la convalida con ok() e i controlli con is_leap()
  • sys_days per i calcoli sui giorni e la ricerca del giorno della settimana
  • last per la fine del mese, oltre a un'introduzione a zoned_time

Questo completa il corso Time e libreria Chrono.

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Calendario e fusi orari» è gratuita?

Sì — il testo completo di «Calendario e fusi orari» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Calendario e fusi orari»?

Usare i tipi di calendario di C++20 Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Calendario e fusi orari»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Durate e orologi
  2. Punti nel tempo
  3. Misurare le prestazioni del codice
  4. Calendario e fusi orari
← Torna a C++ Academy