C ++ 20'de zaman: Takvimin tarihlerini temsil eder ve kontrol eder
“C ++ 20'de Zaman: Takvim Tarihleri Oluştur” makalemde, bugün göreceğim ve kontrol edeceğim takvim verilerini oluşturdum.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Bu makale, Chrono'nun C ++ 20'ye uzatılması yoluyla ayrıntılı yolculuğumun beşinci katkısıdır:
Takvim verilerini görüntüleyin
Sayesinde std::chrono::local_days VEYA std::chrono::sys_days Yerel bir sistemde takvim verilerini veyastd::chrono::time_point dönüştürmek. Kullanmak std::chrono::sys_days Benim örneğimde. std::chrono::sys_days Dayanıyor std::chrono::system_clock.
// sysDays.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << 'n';
using std::chrono::last;
using std::chrono::year;
using std::chrono::sys_days;
using std::chrono::March;
using std::chrono::February;
using std::chrono::Monday;
using std::chrono::Thursday;
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (1)
std::cout << "sys_days(yearMonthDayLast): "
<< sys_days(yearMonthDayLast) << 'n';
constexpr auto yearMonthWeekday{year(2020)/March/Thursday[2]};
std::cout << "sys_days(yearMonthWeekday): "
<< sys_days(yearMonthWeekday) << 'n';
constexpr
auto yearMonthWeekdayLast{year(2010)/March/Monday[last]};
std::cout << "sys_days(yearMonthWeekdayLast): "
<< sys_days(yearMonthWeekdayLast) << 'n';
std::cout << 'n';
constexpr auto leapDate{year(2012)/February/last};
std::cout << "sys_days(leapDate): "
<< sys_days(leapDate) << 'n'; // (2)
constexpr auto noLeapDate{year(2013)/February/last};
std::cout << "sys_day(noLeapDate): "
<< sys_days(noLeapDate) << 'n'; // (3)
std::cout << 'n';
}
Sabit std::chrono::last (1) Ayda kaç gün hızla keşfedebilirim. Baskı, 2012'nin bir yıl atlama (2) olduğunu, ancak 2013'te hiçbirini gösterdiğini gösteriyor.
Takvim tarihi için year(2100)/2/29 İlk soru şu olabilir: Bu tarih geçerli mi?
Bir tarihin geçerli olup olmadığını kontrol edin
C ++ 20'deki farklı takvim türleri işleve sahiptir ok. Bu işlev verir true Tarih geçerliyse geri.
// leapYear.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << std::boolalpha << 'n';
std::cout << "Valid days" << 'n'; // (1)
std::chrono::day day31(31);
std::chrono::day day32 = day31 + std::chrono::days(1);
std::cout << " day31: " << day31 << "; ";
std::cout << "day31.ok(): " << day31.ok() << 'n';
std::cout << " day32: " << day32 << "; ";
std::cout << "day32.ok(): " << day32.ok() << 'n';
std::cout << 'n';
std::cout << "Valid months" << 'n'; // (2)
std::chrono::month month1(1);
std::chrono::month month0(0);
std::cout << " month1: " << month1 << "; ";
std::cout << "month1.ok(): " << month1.ok() << 'n';
std::cout << " month0: " << month0 << "; ";
std::cout << "month0.ok(): " << month0.ok() << 'n';
std::cout << 'n';
std::cout << "Valid years" << 'n'; // (3)
std::chrono::year year2020(2020);
std::chrono::year year32768(-32768);
std::cout << " year2020: " << year2020 << "; ";
std::cout << "year2020.ok(): " << year2020.ok() << 'n';
std::cout << " year32768: " << year32768 << "; ";
std::cout << "year32768.ok(): " << year32768.ok() << 'n';
std::cout << 'n';
std::cout << "Leap Years" << 'n';
constexpr auto leapYear2016{std::chrono::year(2016)/2/29};
constexpr auto leapYear2020{std::chrono::year(2020)/2/29};
constexpr auto leapYear2024{std::chrono::year(2024)/2/29};
std::cout << " leapYear2016.ok(): "
<< leapYear2016.ok() << 'n';
std::cout << " leapYear2020.ok(): "
<< leapYear2020.ok() << 'n';
std::cout << " leapYear2024.ok(): "
<< leapYear2024.ok() << 'n';
std::cout << 'n';
std::cout << "No Leap Years" << 'n';
constexpr auto leapYear2100{std::chrono::year(2100)/2/29};
constexpr auto leapYear2200{std::chrono::year(2200)/2/29};
constexpr auto leapYear2300{std::chrono::year(2300)/2/29};
std::cout << " leapYear2100.ok(): "
<< leapYear2100.ok() << 'n';
std::cout << " leapYear2200.ok(): "
<< leapYear2200.ok() << 'n';
std::cout << " leapYear2300.ok(): "
<< leapYear2300.ok() << 'n';
std::cout << 'n';
std::cout << "Leap Years" << 'n';
constexpr auto leapYear2000{std::chrono::year(2000)/2/29};
constexpr auto leapYear2400{std::chrono::year(2400)/2/29};
constexpr auto leapYear2800{std::chrono::year(2800)/2/29};
std::cout << " leapYear2000.ok(): "
<< leapYear2000.ok() << 'n';
std::cout << " leapYear2400.ok(): "
<< leapYear2400.ok() << 'n';
std::cout << " leapYear2800.ok(): "
<< leapYear2800.ok() << 'n';
std::cout << 'n';
}
Belirli bir gün (1), belirli bir ay (2) veya belirli bir yıl (3) geçerli ise programdaki kontrol. Bir gün için alan [1, 31]bir ay boyunca [1, 12] Ve bir yıl boyunca [ -32767, 32767]. Sonuç olarak verirler ok()-karşılık gelen değerler için false Geriye doğru. Farklı değerlerin reklamını yaptığımda iki gerçek ilginç. Birincisi: Değer geçerli olmadığında, baskı şöyle gösterir: “Geçerli bir gün değil”, “geçerli bir ay değil”, “geçerli bir yıl değil”. İkincisi, değerler bir dize olarak görüntülenir.
. ok-Call bir takvim tarihine uygulanabilir. Şimdi, takvimin belirli bir tarihinin bir geçiş günü olup olmadığını kontrol etmek oldukça kolaydır ve ilgili yıl bir sıçrama yılıdır. Tüm dünyada kullanılan Gregoryen takviminde aşağıdaki kurallar geçerlidir:
Her yıl 4 ile bölünebilen bir yıl atlama yılıdır.
Sırada ne var?
Genişletilmiş Chrono kütüphanesi, takvim verileri arasındaki sürenin süresini sorgulamayı nispeten kolaylaştırır.
(RME)
C ++ 20'de zaman: Takvimin tarihlerini temsil eder ve kontrol eder
“C ++ 20'de Zaman: Takvim Tarihleri Oluştur” makalemde, bugün göreceğim ve kontrol edeceğim takvim verilerini oluşturdum.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Bu makale, Chrono'nun C ++ 20'ye uzatılması yoluyla ayrıntılı yolculuğumun beşinci katkısıdır:

Takvim verilerini görüntüleyin
Sayesinde std::chrono::local_days VEYA std::chrono::sys_days Yerel bir sistemde takvim verilerini veyastd::chrono::time_point dönüştürmek. Kullanmak std::chrono::sys_days Benim örneğimde. std::chrono::sys_days Dayanıyor std::chrono::system_clock.
// sysDays.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << 'n';
using std::chrono::last;
using std::chrono::year;
using std::chrono::sys_days;
using std::chrono::March;
using std::chrono::February;
using std::chrono::Monday;
using std::chrono::Thursday;
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (1)
std::cout << "sys_days(yearMonthDayLast): "
<< sys_days(yearMonthDayLast) << 'n';
constexpr auto yearMonthWeekday{year(2020)/March/Thursday[2]};
std::cout << "sys_days(yearMonthWeekday): "
<< sys_days(yearMonthWeekday) << 'n';
constexpr
auto yearMonthWeekdayLast{year(2010)/March/Monday[last]};
std::cout << "sys_days(yearMonthWeekdayLast): "
<< sys_days(yearMonthWeekdayLast) << 'n';
std::cout << 'n';
constexpr auto leapDate{year(2012)/February/last};
std::cout << "sys_days(leapDate): "
<< sys_days(leapDate) << 'n'; // (2)
constexpr auto noLeapDate{year(2013)/February/last};
std::cout << "sys_day(noLeapDate): "
<< sys_days(noLeapDate) << 'n'; // (3)
std::cout << 'n';
}
Sabit std::chrono::last (1) Ayda kaç gün hızla keşfedebilirim. Baskı, 2012'nin bir yıl atlama (2) olduğunu, ancak 2013'te hiçbirini gösterdiğini gösteriyor.

Takvim tarihi için year(2100)/2/29 İlk soru şu olabilir: Bu tarih geçerli mi?
Bir tarihin geçerli olup olmadığını kontrol edin
C ++ 20'deki farklı takvim türleri işleve sahiptir ok. Bu işlev verir true Tarih geçerliyse geri.
// leapYear.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << std::boolalpha << 'n';
std::cout << "Valid days" << 'n'; // (1)
std::chrono::day day31(31);
std::chrono::day day32 = day31 + std::chrono::days(1);
std::cout << " day31: " << day31 << "; ";
std::cout << "day31.ok(): " << day31.ok() << 'n';
std::cout << " day32: " << day32 << "; ";
std::cout << "day32.ok(): " << day32.ok() << 'n';
std::cout << 'n';
std::cout << "Valid months" << 'n'; // (2)
std::chrono::month month1(1);
std::chrono::month month0(0);
std::cout << " month1: " << month1 << "; ";
std::cout << "month1.ok(): " << month1.ok() << 'n';
std::cout << " month0: " << month0 << "; ";
std::cout << "month0.ok(): " << month0.ok() << 'n';
std::cout << 'n';
std::cout << "Valid years" << 'n'; // (3)
std::chrono::year year2020(2020);
std::chrono::year year32768(-32768);
std::cout << " year2020: " << year2020 << "; ";
std::cout << "year2020.ok(): " << year2020.ok() << 'n';
std::cout << " year32768: " << year32768 << "; ";
std::cout << "year32768.ok(): " << year32768.ok() << 'n';
std::cout << 'n';
std::cout << "Leap Years" << 'n';
constexpr auto leapYear2016{std::chrono::year(2016)/2/29};
constexpr auto leapYear2020{std::chrono::year(2020)/2/29};
constexpr auto leapYear2024{std::chrono::year(2024)/2/29};
std::cout << " leapYear2016.ok(): "
<< leapYear2016.ok() << 'n';
std::cout << " leapYear2020.ok(): "
<< leapYear2020.ok() << 'n';
std::cout << " leapYear2024.ok(): "
<< leapYear2024.ok() << 'n';
std::cout << 'n';
std::cout << "No Leap Years" << 'n';
constexpr auto leapYear2100{std::chrono::year(2100)/2/29};
constexpr auto leapYear2200{std::chrono::year(2200)/2/29};
constexpr auto leapYear2300{std::chrono::year(2300)/2/29};
std::cout << " leapYear2100.ok(): "
<< leapYear2100.ok() << 'n';
std::cout << " leapYear2200.ok(): "
<< leapYear2200.ok() << 'n';
std::cout << " leapYear2300.ok(): "
<< leapYear2300.ok() << 'n';
std::cout << 'n';
std::cout << "Leap Years" << 'n';
constexpr auto leapYear2000{std::chrono::year(2000)/2/29};
constexpr auto leapYear2400{std::chrono::year(2400)/2/29};
constexpr auto leapYear2800{std::chrono::year(2800)/2/29};
std::cout << " leapYear2000.ok(): "
<< leapYear2000.ok() << 'n';
std::cout << " leapYear2400.ok(): "
<< leapYear2400.ok() << 'n';
std::cout << " leapYear2800.ok(): "
<< leapYear2800.ok() << 'n';
std::cout << 'n';
}
Belirli bir gün (1), belirli bir ay (2) veya belirli bir yıl (3) geçerli ise programdaki kontrol. Bir gün için alan [1, 31]bir ay boyunca [1, 12] Ve bir yıl boyunca [ -32767, 32767]. Sonuç olarak verirler ok()-karşılık gelen değerler için false Geriye doğru. Farklı değerlerin reklamını yaptığımda iki gerçek ilginç. Birincisi: Değer geçerli olmadığında, baskı şöyle gösterir: “Geçerli bir gün değil”, “geçerli bir ay değil”, “geçerli bir yıl değil”. İkincisi, değerler bir dize olarak görüntülenir.

. ok-Call bir takvim tarihine uygulanabilir. Şimdi, takvimin belirli bir tarihinin bir geçiş günü olup olmadığını kontrol etmek oldukça kolaydır ve ilgili yıl bir sıçrama yılıdır. Tüm dünyada kullanılan Gregoryen takviminde aşağıdaki kurallar geçerlidir:
Her yıl 4 ile bölünebilen bir yıl atlama yılıdır.
- 100'ü bölünebilen yıllar hariç. Bunlar yıl atlamıyor.
- İstisna için istisna, 400'e bölünebilen yılların ana yıl olması istisnasıdır.
Sırada ne var?
Genişletilmiş Chrono kütüphanesi, takvim verileri arasındaki sürenin süresini sorgulamayı nispeten kolaylaştırır.
(RME)