Ş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:
ecember
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>
#include <iostream>
int main() {
std::cout << 'n';
using namespace std::chrono_literals;
using std::chrono::last;
using std::chrono::year;
using std::chrono::month;
using std::chrono::day;
using std::chrono::year_month;
using std::chrono::year_month_day;
using std::chrono::year_month_day_last;
using std::chrono::year_month_weekday;
using std::chrono::year_month_weekday_last;
using std::chrono::month_weekday;
using std::chrono::month_weekday_last;
using std::chrono::month_day;
using std::chrono::month_day_last;
using std::chrono::weekday_last;
using std::chrono::weekday;
using std::chrono::January;
using std::chrono::February;
using std::chrono::June;
using std::chrono::March;
using std::chrono::October;
using std::chrono::Monday;
using std::chrono::Thursday;
using std::chrono::Sunday;
constexpr auto
yearMonthDay{year(1940)/month(6)/day(26)}; // (1)
std::cout << yearMonthDay << " ";
std::cout << year_month_day(1940y, June, 26d) << 'n'; // (2)
std::cout << 'n';
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (3)
std::cout << yearMonthDayLast << " ";
std::cout <<
year_month_day_last(2010y, month_day_last(month(3)))
<< 'n';
constexpr auto
yearMonthWeekday{year(2020)/March/Thursday[2]}; // (4)
std::cout << yearMonthWeekday << " ";
std::cout << year_month_weekday(2020y,
month(March),
Thursday[2]) << 'n';
constexpr auto
yearMonthWeekdayLast{year(2010)/March/Monday[last]}; // (5)
std::cout << yearMonthWeekdayLast << " ";
std::cout << year_month_weekday_last(2010y,
month(March),
weekday_last(Monday));
std::cout << "nn";
constexpr auto day_{day(19)}; // (6)
std::cout << day_ << " ";
std::cout << day(19) << 'n';
constexpr auto month_{month(1)}; // (7)
std::cout << month_ << " ";
std::cout << month(1) << 'n';
constexpr auto year_{year(1988)}; // (8)
std::cout << year_ << " ";
std::cout << year(1988) << 'n';
constexpr auto weekday_{weekday(5)};
std::cout << weekday_ << " ";
std::cout << weekday(5) << 'n';
constexpr auto yearMonth{year(1988)/1};
std::cout << yearMonth << " ";
std::cout << year_month(year(1988), January) << 'n';
constexpr auto monthDay{10/day(22)};
std::cout << monthDay << " ";
std::cout << month_day(October, day(22)) << 'n';
constexpr auto monthDayLast{June/last};
std::cout << monthDayLast << " ";
std::cout << month_day_last(month(6)) << 'n';
constexpr auto monthWeekday{2/Monday[3]};
std::cout << monthWeekday << " ";
std::cout << month_weekday(February, Monday[3]) << 'n';
constexpr auto monthWeekDayLast{June/Sunday[last]};
std::cout << monthWeekDayLast << " ";
std::cout << month_weekday_last(June, weekday_last(Sunday))
<< 'n';
std::cout << 'n';
}
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.
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:
ecember.
Cute sözdizimi ile aşağıdaki üç yıl, ay ve gün kombinasyonu mümkündür.
year/month/day
day/month/year
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
#include <chrono>
#include <iostream>
int main() {
std::cout << 'n';
constexpr auto yearMonthDay{std::chrono::year(1966)/6/26};
std::cout << yearMonthDay << 'n';
constexpr auto dayMonthYear{std::chrono::day(26)/6/1966};
std::cout << dayMonthYear << 'n';
constexpr auto monthDayYear{std::chrono::month(6)/26/1966};
std::cout << monthDayYear << 'n';
constexpr auto
yearDayMonth{std::chrono::year(1966)/std::chrono::month(26)/6};
std::cout << yearDayMonth << 'n';
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
Ş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:
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>
#include <iostream>
int main() {
std::cout << 'n';
using namespace std::chrono_literals;
using std::chrono::last;
using std::chrono::year;
using std::chrono::month;
using std::chrono::day;
using std::chrono::year_month;
using std::chrono::year_month_day;
using std::chrono::year_month_day_last;
using std::chrono::year_month_weekday;
using std::chrono::year_month_weekday_last;
using std::chrono::month_weekday;
using std::chrono::month_weekday_last;
using std::chrono::month_day;
using std::chrono::month_day_last;
using std::chrono::weekday_last;
using std::chrono::weekday;
using std::chrono::January;
using std::chrono::February;
using std::chrono::June;
using std::chrono::March;
using std::chrono::October;
using std::chrono::Monday;
using std::chrono::Thursday;
using std::chrono::Sunday;
constexpr auto
yearMonthDay{year(1940)/month(6)/day(26)}; // (1)
std::cout << yearMonthDay << " ";
std::cout << year_month_day(1940y, June, 26d) << 'n'; // (2)
std::cout << 'n';
constexpr auto yearMonthDayLast{year(2010)/March/last}; // (3)
std::cout << yearMonthDayLast << " ";
std::cout <<
year_month_day_last(2010y, month_day_last(month(3)))
<< 'n';
constexpr auto
yearMonthWeekday{year(2020)/March/Thursday[2]}; // (4)
std::cout << yearMonthWeekday << " ";
std::cout << year_month_weekday(2020y,
month(March),
Thursday[2]) << 'n';
constexpr auto
yearMonthWeekdayLast{year(2010)/March/Monday[last]}; // (5)
std::cout << yearMonthWeekdayLast << " ";
std::cout << year_month_weekday_last(2010y,
month(March),
weekday_last(Monday));
std::cout << "nn";
constexpr auto day_{day(19)}; // (6)
std::cout << day_ << " ";
std::cout << day(19) << 'n';
constexpr auto month_{month(1)}; // (7)
std::cout << month_ << " ";
std::cout << month(1) << 'n';
constexpr auto year_{year(1988)}; // (8)
std::cout << year_ << " ";
std::cout << year(1988) << 'n';
constexpr auto weekday_{weekday(5)};
std::cout << weekday_ << " ";
std::cout << weekday(5) << 'n';
constexpr auto yearMonth{year(1988)/1};
std::cout << yearMonth << " ";
std::cout << year_month(year(1988), January) << 'n';
constexpr auto monthDay{10/day(22)};
std::cout << monthDay << " ";
std::cout << month_day(October, day(22)) << 'n';
constexpr auto monthDayLast{June/last};
std::cout << monthDayLast << " ";
std::cout << month_day_last(month(6)) << 'n';
constexpr auto monthWeekday{2/Monday[3]};
std::cout << monthWeekday << " ";
std::cout << month_weekday(February, Monday[3]) << 'n';
constexpr auto monthWeekDayLast{June/Sunday[last]};
std::cout << monthWeekDayLast << " ";
std::cout << month_weekday_last(June, weekday_last(Sunday))
<< 'n';
std::cout << 'n';
}
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))
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:
Cute sözdizimi ile aşağıdaki üç yıl, ay ve gün kombinasyonu mümkündür.
year/month/day
day/month/year
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
#include <chrono>
#include <iostream>
int main() {
std::cout << 'n';
constexpr auto yearMonthDay{std::chrono::year(1966)/6/26};
std::cout << yearMonthDay << 'n';
constexpr auto dayMonthYear{std::chrono::day(26)/6/1966};
std::cout << dayMonthYear << 'n';
constexpr auto monthDayYear{std::chrono::month(6)/26/1966};
std::cout << monthDayYear << 'n';
constexpr auto
yearDayMonth{std::chrono::year(1966)/std::chrono::month(26)/6};
std::cout << yearDayMonth << 'n';
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