C++ Academy · Lekcja

Kalendarz i strefy czasowe

Używaj typów kalendarza C++20

Lekcja 4 z 413 kroki

Kalendarz i strefy czasowe to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Typy kalendarzowe C++20

C++20 dodał rozbudowaną obsługę kalendarza do <chrono>. Można teraz wyrażać lata, miesiące i dni bezpośrednio za pomocą typów, zamiast operować na liczbach całkowitych.

  • year, month, day
  • year_month_day reprezentujący pełną datę
#include <iostream>
#include <chrono>

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

Literały kalendarzowe

Literały kalendarzowe, takie jak 2026y i 15d, oraz nazwane miesiące, takie jak std::chrono::May, sprawiają, że daty zapisuje się w naturalny sposób.

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

Tworzenie daty

Należy połączyć trzy elementy za pomocą operatora /, aby utworzyć obiekt year_month_day. Kolejność odpowiada kolejno rokowi, miesiącowi i dniu.

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

Sprawdzanie poprawności dat

Obiekt year_month_day wie, czy reprezentuje prawidłową datę kalendarzową. Należy użyć ok(), aby odrzucać niemożliwe wartości, takie jak 30 lutego.

#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

Należy przekonwertować datę na sys_days, czyli liczbę dni od epoki. Umożliwia to wykonywanie działań na dniach i obliczanie różnic między datami.

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

Arytmetyka dni

Dodanie days{n} do obiektu sys_days przesuwa datę o n dni do przodu, po czym można ponownie przekonwertować ją na datę kalendarzową.

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

Dzień tygodnia

Należy przekonwertować obiekt sys_days na weekday, aby ustalić, na jaki dzień tygodnia przypada dana 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;
}

Ostatni dzień miesiąca

Specjalny znacznik last oblicza ostatni dzień dowolnego miesiąca i automatycznie uwzględnia lata przestępne.

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

Sprawdzanie roku przestępnego

Typ year udostępnia metodę is_leap(), dzięki czemu nie trzeba samodzielnie pamiętać reguł podzielności.

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

Od punktu w czasie do daty

Należy zaokrąglić w dół punkt w czasie z zegara system_clock do days i przekonwertować go na year_month_day, aby uzyskać dzisiejszą datę kalendarzową.

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

Strefy czasowe

C++20 dodaje również strefy czasowe za pośrednictwem std::chrono::zoned_time i bazy danych IANA. Dostępność zależy od biblioteki standardowej, ale ten model łączy punkt w czasie z nazwaną strefą, aby poprawnie wyświetlać czas lokalny.

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

Szybkie sprawdzenie

Sprawdź swoje rozumienie typów kalendarzowych C++20.

Podsumowanie

Poznano obsługę kalendarza w C++20:

  • year, month, day oraz year_month_day wraz z operatorem budującym /
  • walidację za pomocą ok() i sprawdzanie lat przestępnych za pomocą is_leap()
  • sys_days do wykonywania działań na dniach i ustalania dnia tygodnia
  • last do wyznaczania końca miesiąca oraz podstawy użycia zoned_time

To kończy kurs dotyczący czasu i biblioteki Chrono.

Bezpłatny start

Ucz się C++ dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Kalendarz i strefy czasowe” jest bezpłatna?

Tak — pełny tekst „Kalendarz i strefy czasowe” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Kalendarz i strefy czasowe”?

Używaj typów kalendarza C++20 Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Kalendarz i strefy czasowe”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Czasy trwania i zegary
  2. Punkty w czasie
  3. Pomiar wydajności kodu
  4. Kalendarz i strefy czasowe
← Powrót do C++ Academy