C++20'de saat: Takvim randevularını görüntüleyin ve kontrol edin

Adanali

Active member
C++20'de saat: Takvim randevularını görüntüleyin ve kontrol edin


  1. C++20'de saat: Takvim randevularını görüntüleyin ve kontrol edin

Son yazım olan “C++20'de Zaman: Takvim Etkinlikleri Oluşturma”da bugün görüntüleyip inceleyeceğim takvim tarihlerini oluşturdum.

Duyuru








Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.







Bu makale, C++20'deki Chrono uzantısıyla ilgili ayrıntılı yolculuğumun beşinci yazısıdır:








Takvim verilerini görüntüle


Sayesinde std::chrono::local_days VEYA std::chrono::sys_days Takvim verilerini yerel olarak veya bir sisteme aktarabilirsinizstd::chrono::time_point dönüştürmek. kullanırım std::chrono::sys_days benim örneğimde. std::chrono::sys_days dayalı std::chrono::system_clock.


// sysDays.cpp

#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
using std::chrono::last;&#13;
&#13;
using std::chrono::year;&#13;
using std::chrono::sys_days;&#13;
&#13;
using std::chrono::March;&#13;
using std::chrono::February;&#13;
&#13;
using std::chrono::Monday;&#13;
using std::chrono::Thursday;&#13;
&#13;
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (1)&#13;
std::cout << "sys_days(yearMonthDayLast): " &#13;
<< sys_days(yearMonthDayLast) << 'n';&#13;
&#13;
constexpr auto yearMonthWeekday{year(2020)/March/Thursday[2]};&#13;
std::cout << "sys_days(yearMonthWeekday): " &#13;
<< sys_days(yearMonthWeekday) << 'n';&#13;
&#13;
constexpr &#13;
auto yearMonthWeekdayLast{year(2010)/March/Monday[last]};&#13;
std::cout << "sys_days(yearMonthWeekdayLast): " &#13;
<< sys_days(yearMonthWeekdayLast) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
constexpr auto leapDate{year(2012)/February/last}; &#13;
std::cout << "sys_days(leapDate): " &#13;
<< sys_days(leapDate) << 'n'; // (2)&#13;
&#13;
constexpr auto noLeapDate{year(2013)/February/last}; &#13;
std::cout << "sys_day(noLeapDate): " &#13;
<< sys_days(noLeapDate) << 'n'; // (3)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Sabit ile std::chrono::last (1) Bir ayda kaç gün olduğunu hızlı bir şekilde belirleyebilirim. Çıktı, 2012'nin artık yıl olduğunu (2) ancak 2013'ün olmadığını gösteriyor.








Gibi bir 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 aşağıdaki işleve sahiptir: ok. Bu özellik verir true tarih geçerliyse geri dönün.


// leapYear.cpp&#13;
&#13;
#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << std::boolalpha << 'n';&#13;
&#13;
std::cout << "Valid days" << 'n'; // (1)&#13;
std::chrono::day day31(31);&#13;
std::chrono::day day32 = day31 + std::chrono::days(1);&#13;
std::cout << " day31: " << day31 << "; ";&#13;
std::cout << "day31.ok(): " << day31.ok() << 'n';&#13;
std::cout << " day32: " << day32 << "; ";&#13;
std::cout << "day32.ok(): " << day32.ok() << 'n';&#13;
&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Valid months" << 'n'; // (2)&#13;
std::chrono::month month1(1);&#13;
std::chrono::month month0(0);&#13;
std::cout << " month1: " << month1 << "; ";&#13;
std::cout << "month1.ok(): " << month1.ok() << 'n';&#13;
std::cout << " month0: " << month0 << "; ";&#13;
std::cout << "month0.ok(): " << month0.ok() << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Valid years" << 'n'; // (3)&#13;
std::chrono::year year2020(2020);&#13;
std::chrono::year year32768(-32768);&#13;
std::cout << " year2020: " << year2020 << "; ";&#13;
std::cout << "year2020.ok(): " << year2020.ok() << 'n';&#13;
std::cout << " year32768: " << year32768 << "; ";&#13;
std::cout << "year32768.ok(): " << year32768.ok() << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Leap Years" << 'n'; &#13;
&#13;
constexpr auto leapYear2016{std::chrono::year(2016)/2/29};&#13;
constexpr auto leapYear2020{std::chrono::year(2020)/2/29};&#13;
constexpr auto leapYear2024{std::chrono::year(2024)/2/29};&#13;
&#13;
std::cout << " leapYear2016.ok(): " &#13;
<< leapYear2016.ok() << 'n';&#13;
std::cout << " leapYear2020.ok(): " &#13;
<< leapYear2020.ok() << 'n';&#13;
std::cout << " leapYear2024.ok(): " &#13;
<< leapYear2024.ok() << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "No Leap Years" << 'n'; &#13;
&#13;
constexpr auto leapYear2100{std::chrono::year(2100)/2/29};&#13;
constexpr auto leapYear2200{std::chrono::year(2200)/2/29};&#13;
constexpr auto leapYear2300{std::chrono::year(2300)/2/29};&#13;
&#13;
std::cout << " leapYear2100.ok(): " &#13;
<< leapYear2100.ok() << 'n';&#13;
std::cout << " leapYear2200.ok(): " &#13;
<< leapYear2200.ok() << 'n';&#13;
std::cout << " leapYear2300.ok(): "&#13;
<< leapYear2300.ok() << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Leap Years" << 'n'; &#13;
&#13;
constexpr auto leapYear2000{std::chrono::year(2000)/2/29};&#13;
constexpr auto leapYear2400{std::chrono::year(2400)/2/29};&#13;
constexpr auto leapYear2800{std::chrono::year(2800)/2/29};&#13;
&#13;
std::cout << " leapYear2000.ok(): " &#13;
<< leapYear2000.ok() << 'n';&#13;
std::cout << " leapYear2400.ok(): " &#13;
<< leapYear2400.ok() << 'n';&#13;
std::cout << " leapYear2800.ok(): " &#13;
<< leapYear2800.ok() << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Programda belirli bir günün (1), belirli bir ayın (2) veya belirli bir yılın (3) geçerli olup olmadığını kontrol ediyorum. Bir günlük alan [1, 31]bir ay için [1, 12] ve bir yıl boyunca [ -32767, 32767]. Sonuç olarak veriyorlar ok()-Değerlerin eşleştirilmesine yönelik istemler false Geriye doğru. Farklı değerlere baktığımda iki gerçek ilginç oluyor. Birincisi: değer geçersizse çıktı şunu 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.








THE ok-Çağrı bir takvim tarihine uygulanabilir. Belirli bir takvim tarihinin artık gün olup olmadığını ve ilgili yılın artık yıl olup olmadığını kontrol etmek artık oldukça basit. Dünya genelinde kullanılan Gregoryen takviminde aşağıdaki kurallar geçerlidir:

4'e tam olarak bölünebilen her yıl artık yıldır.

  • 100'e tam olarak bölünebilen yıllar hariç. Bunlar artık yıllar değildir.
  • Bu istisna, 400'e tam olarak bölünebilen yılların artık yıl olması istisnası için geçerlidir.
Çok karışık? program leapYears.cpp bu kuralı göstermektedir.

Sıradaki ne?


Genişletilmiş Chrono kütüphanesi, takvim tarihleri arasındaki sürenin uzunluğunu sorgulamayı nispeten kolaylaştırır.


(kendim)



Haberin Sonu
 
Üst