Kalendarz i strefy czasowe
Używaj typów kalendarza C++20
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,dayyear_month_dayreprezentują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,dayorazyear_month_daywraz z operatorem budującym/- walidację za pomocą
ok()i sprawdzanie lat przestępnych za pomocąis_leap() sys_daysdo wykonywania działań na dniach i ustalania dnia tygodnialastdo wyznaczania końca miesiąca oraz podstawy użyciazoned_time
To kończy kurs dotyczący czasu i biblioteki Chrono.
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
- Czasy trwania i zegary
- Punkty w czasie
- Pomiar wydajności kodu
- Kalendarz i strefy czasowe