Şimdi C++20'de: Takvim etkinlikleri oluşturma

Adanali

Member


  1. Şimdi C++20'de: Takvim etkinlikleri oluşturma

C++20, takvim ve tarih veri türlerinin kullanımını basitleştirmek için sabitleri ve değişmez değerleri destekler.

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.







Temel bilgiler hakkında daha fazla bilgi edinmek istiyorsanız önceki makalelerimi okumalısınız:








Takvim türleri için sabitler ve değişmez değerler


Sabitler için ile 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 iki yeni değişmez: d VE y. Daha fazla ayrıntıyı C++20'de Zaman: Zaman Süresi ve Zaman Noktası ile Kronograf Terminolojisine Giriş makalesinde bulabilirsiniz.

Takvim verileri oluştur


program createCalendar.cpp takvim tarihleri oluşturmanın farklı yollarını gösterir.


// 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;



Takvim tarihi oluşturmanın iki yolu vardır – sözde sevimli sözdizimi yearMonthDay{year(1940)/month(6)/day(26)} (1) veya açık veri türü date::year_month_day(1940y, June, 26d) (2). Cute'ın sözdiziminin açıklamasını bir sonraki bölüme bırakacağım. Açık veri türü ilginçtir çünkü tarih ve saat değişmezlerini içerir 1940y, 26d ve varsayılan sabit June kullanılmış. Programın bariz kısmı buydu.

(3), (4) ve (5), takvim verileri oluşturmanın ek yollarını sağlar.

  • (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şembesi: {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))
Geri kalan veri türleri bir günü (6), bir ayı (7) veya bir yılı (8) temsil eder. Bunları (3), (4) veya (5)'te olduğu gibi tam olarak belirtilen takvim tarihleri için temel yapı taşları olarak birleştirebilirsiniz.

Bu programın çıktısıdır:








Söz verdiğim gibi artık Cute'ın sözdizimi hakkında yazmak istiyorum.

Güzel sözdizimi


Nice sözdizimi, bir takvim tarihini belirtmek için aşırı yüklenmiş bölme operatörlerinden oluşur. Aşırı yüklenmiş operatörler zamansal değişmezleri destekler (ör. 2020y, 31d) VE std::chrono::month Sabitleri severim std::chrono::January, std::chrono::February, ..., std::chrono::December.

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


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


Bu kombinasyonlar keyfi olarak seçilmemektedir. Dünya çapında en yaygın kullanılanlardır. Başka herhangi bir kombinasyona izin verilmez.

Yani eğer veri tipiniz varsa year, month VEYA day ilk argüman için, diğer iki argüman için artık türe gerek yoktur ve iş bir sayı ile yapılır.


// 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/ay için en son değerlere izin verilmez ve çalışma zamanı mesajı oluşturulur.








Sıradaki ne?


Takvim tarihi hakkında {Jahr(2010)/March/last} Operatörler insanlar tarafından okunabilir biçimde mevcuttur; örneğin 2020-03-31 local_days VEYA sys_days kullanmak için.


(kendim)



Haberin Sonu
 
Üst