C ++ 20'de Zaman: Takvim Tarihleri Oluştur

Adanali

Active member
C ++ 20'de Zaman: Takvim Tarihleri Oluştur


  1. C ++ 20'de Zaman: Takvim Tarihleri Oluştur

C ++ 20, takvimler ve tarih için veri türlerinin kullanımını basitleştirmek için sabit ve tam anlamıyla destekler.










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.







Temeller hakkında daha fazla bilgi edinmek istiyorsanız, önceki makalemi okumalısınız:








Takvim türleri için sabit ve kelimenin tam anlamıyla


Sabitlerle başlayalım std::chrono::weekday VE std::chrono::month.




std::chrono::Monday
std::chrono::Thuesday
std::chrono::Wednesday
std::chrono::Thursday
std::chrono::Friday
std::chrono::Saturday
std::chrono::Sunday


std::chrono::January
std::chrono::February
std::chrono::March
std::chrono::April
std::chrono::May
std::chrono::June
std::chrono::July
std::chrono::August
std::chrono::September
std::chrono::October
std::chrono::November
std::chrono::December


C ++ 20 veri türlerini destekler std::chrono::day VE std::chrono::year İki yeni litre: d VE y. Daha fazla ayrıntı C ++ 20: Time ile Chrono Terminolojisine Giriş.

Takvim Verileri Oluştur


Program createCalendar.cpp Takvim verileri oluşturmanın çeşitli yollarını gösterin.


// createCalendar.cpp

#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
using namespace std::chrono_literals; &#13;
&#13;
using std::chrono::last;&#13;
&#13;
using std::chrono::year;&#13;
using std::chrono::month;&#13;
using std::chrono::day;&#13;
&#13;
using std::chrono::year_month;&#13;
using std::chrono::year_month_day;&#13;
using std::chrono::year_month_day_last;&#13;
using std::chrono::year_month_weekday;&#13;
using std::chrono::year_month_weekday_last;&#13;
using std::chrono::month_weekday;&#13;
using std::chrono::month_weekday_last;&#13;
using std::chrono::month_day;&#13;
using std::chrono::month_day_last;&#13;
using std::chrono::weekday_last;&#13;
using std::chrono::weekday;&#13;
&#13;
using std::chrono::January;&#13;
using std::chrono::February;&#13;
using std::chrono::June;&#13;
using std::chrono::March;&#13;
using std::chrono::October;&#13;
&#13;
using std::chrono::Monday;&#13;
using std::chrono::Thursday;&#13;
using std::chrono::Sunday;&#13;
&#13;
constexpr auto&#13;
yearMonthDay{year(1940)/month(6)/day(26)}; // (1)&#13;
std::cout << yearMonthDay << " ";&#13;
std::cout << year_month_day(1940y, June, 26d) << 'n'; // (2)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (3)&#13;
std::cout << yearMonthDayLast << " ";&#13;
std::cout << &#13;
year_month_day_last(2010y, month_day_last(month(3))) &#13;
<< 'n';&#13;
&#13;
constexpr auto &#13;
yearMonthWeekday{year(2020)/March/Thursday[2]}; // (4)&#13;
std::cout << yearMonthWeekday << " ";&#13;
std::cout << year_month_weekday(2020y, &#13;
month(March), &#13;
Thursday[2]) << 'n';&#13;
&#13;
constexpr auto &#13;
yearMonthWeekdayLast{year(2010)/March/Monday[last]}; // (5)&#13;
std::cout << yearMonthWeekdayLast << " ";&#13;
std::cout << year_month_weekday_last(2010y, &#13;
month(March), &#13;
weekday_last(Monday));&#13;
&#13;
std::cout << "nn";&#13;
&#13;
constexpr auto day_{day(19)}; // (6)&#13;
std::cout << day_ << " ";&#13;
std::cout << day(19) << 'n';&#13;
&#13;
constexpr auto month_{month(1)}; // (7)&#13;
std::cout << month_ << " ";&#13;
std::cout << month(1) << 'n';&#13;
&#13;
constexpr auto year_{year(1988)}; // (8)&#13;
std::cout << year_ << " ";&#13;
std::cout << year(1988) << 'n';&#13;
&#13;
constexpr auto weekday_{weekday(5)};&#13;
std::cout << weekday_ << " ";&#13;
std::cout << weekday(5) << 'n';&#13;
&#13;
constexpr auto yearMonth{year(1988)/1};&#13;
std::cout << yearMonth << " ";&#13;
std::cout << year_month(year(1988), January) << 'n';&#13;
&#13;
constexpr auto monthDay{10/day(22)};&#13;
std::cout << monthDay << " ";&#13;
std::cout << month_day(October, day(22)) << 'n';&#13;
&#13;
constexpr auto monthDayLast{June/last};&#13;
std::cout << monthDayLast << " ";&#13;
std::cout << month_day_last(month(6)) << 'n';&#13;
&#13;
constexpr auto monthWeekday{2/Monday[3]};&#13;
std::cout << monthWeekday << " ";&#13;
std::cout << month_weekday(February, Monday[3]) << 'n';&#13;
&#13;
constexpr auto monthWeekDayLast{June/Sunday[last]};&#13;
std::cout << monthWeekDayLast << " ";&#13;
std::cout << month_weekday_last(June, weekday_last(Sunday)) &#13;
<< 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}&#13;



Bir takvim tarihi oluşturmanın iki yolu vardır: SO -CIVED Sözdizimi yearMonthDay{year(1940)/month(6)/day(26)} (1) veya açık verilerin türü date::year_month_day(1940y, June, 26d) (2). Bir sonraki bölümde sevimli sözdiziminin açıklaması olarak kalıyorum. Açık veri türü ilginç çünkü 1940y,, 26d ve önceden tanımlanmış sabit June kullanılmış. Bu programın bariz bir kısmıydı.

(3), (4) ve (5) takvim verileri oluşturmak için başka yollar sunar.

  • (3): Mart 2010'un son günü: {year(2010)/March/last} VEYA year_month_day_last(2010y,month_day_last(month(3)))
  • (4): Mart 2020'nin ikinci Perşembe: {year(2020)/March/Thursday[2]} VEYA year_month_weekday(2020y, month(March), Thursday[2])
  • (5): Mart 2010'un son Pazartesi günü: {year(2010)/March/Monday[last]} VEYA year_month_weekday_last(2010y, month(March), weekday_last(Monday))
Diğer veri türleri bir gün (6), bir ay (7) veya bir yılı (8) temsil eder. (3), (4) veya (5) 'de olduğu gibi, tamamen belirtilen takvim verileri için temel bloklar olarak birleştirmek mümkündür.

Bu programın baskısı:








Söz verdiği gibi, şimdi sevimli sözdizimi yazmak istiyorum.

Güzel Sözdizimi


Sevimli sözdizimi, bir takvim tarihi belirlemek için aşırı yük bölüm operatörlerinden oluşur. Operatörler zamanın gerçekleri için aşırı destek yükü (ör. 2020y, 31d) VE std::chrono::month Sabit std::chrono::January, std::chrono::February, ..., std::chrono::December.

Sevimli sözdizimi ile yıl, ay ve günün aşağıdaki üç kombinasyonu mümkündür.


year/month/day&#13;
day/month/year&#13;
month/day/year


Bu kombinasyonlar keyfi olarak seçilmez. Tüm dünyada en sık kullanılanlardır. Başka herhangi bir kombinasyona izin verilmez.

Bu yüzden veri türüne sahipseniz year,, month VEYA day İlk konu için seçilen, diğer iki konunun türü artık gerekli değildir ve bir sayı bile yapar.


// cuteSyntax.cpp&#13;
&#13;
#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
constexpr auto yearMonthDay{std::chrono::year(1966)/6/26};&#13;
std::cout << yearMonthDay << 'n';&#13;
&#13;
constexpr auto dayMonthYear{std::chrono::day(26)/6/1966};&#13;
std::cout << dayMonthYear << 'n';&#13;
&#13;
constexpr auto monthDayYear{std::chrono::month(6)/26/1966};&#13;
std::cout << monthDayYear << 'n';&#13;
&#13;
constexpr auto &#13;
yearDayMonth{std::chrono::year(1966)/std::chrono::month(26)/6}; &#13;
std::cout << yearDayMonth << 'n';&#13;
&#13;
std::cout << 'n';


Yıl/gün/aylık en son değerlere izin verilmez ve bir terim oranına yol açar.








Sırada ne var?


Takvim tarihinde {Jahr(2010)/March/last} Begible bir biçimde, örneğin 2020-03-31, operatörler geliyor local_days VEYA sys_days kullanılmış.


(RME)
 
Üst