C++20: Takvim tarihlerini ve sıra tarihlerini sorgulama

Adanali

Active member
C++20: Takvim tarihlerini ve sıra tarihlerini sorgulama


  1. C++20: Takvim tarihlerini ve sıra tarihlerini sorgulama

Bu makale, C++20'deki Chrono uzantısına yaptığım derinlemesine yolculuğumun altıncısıdır:

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.







Takvim verilerini sorgulama


Aşağıdaki program queryCalendarDates.cpp Bazı takvim verilerini hızla ister.


// queryCalendarDates.cpp

#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
using std::chrono::floor;&#13;
&#13;
using std::chrono::January;&#13;
&#13;
using std::chrono::years;&#13;
using std::chrono::days;&#13;
using std::chrono::hours;&#13;
&#13;
using std::chrono::year_month_day;&#13;
using std::chrono::year_month_weekday;&#13;
&#13;
using std::chrono::sys_days;&#13;
&#13;
auto now = std::chrono::system_clock::now(); &#13;
std::cout << "The current time is: " << now << " UTCn"; // (1)&#13;
std::cout << "The current date is: " &#13;
<< floor<days>(now) << 'n';&#13;
std::cout << "The current date is: " &#13;
<< year_month_day{floor<days>(now)} &#13;
<< 'n';&#13;
std::cout << "The current date is: "&#13;
<< year_month_weekday{floor<days>(now)} &#13;
<< 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
&#13;
auto currentDate = year_month_day(floor<days>(now)); // (2)&#13;
auto currentYear = currentDate.year();&#13;
std::cout << "The current year is " << currentYear << 'n';&#13;
auto currentMonth = currentDate.month();&#13;
std::cout << "The current month is " << currentMonth << 'n';&#13;
auto currentDay = currentDate.day();&#13;
std::cout << "The current day is " << currentDay << 'n'; &#13;
&#13;
std::cout << 'n';&#13;
&#13;
auto hAfter = floor<hours>(now) -&#13;
sys_days(January/1/currentYear); // (3)&#13;
std::cout << "It has been " << hAfter &#13;
<< " since New Year!n"; &#13;
auto nextYear = currentDate.year() + years(1); &#13;
auto nextNewYear = sys_days(January/1/nextYear);&#13;
auto hBefore = sys_days(January/1/nextYear) - &#13;
floor<hours>(now); // (4)&#13;
std::cout << "It is " << hBefore << " before New Year!n";&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "It has been " << floor<days>(hAfter) &#13;
<< " since New Year!n"; // (5)&#13;
std::cout << "It is " << floor<days>(hBefore) &#13;
<< " before New Year!n"; // (6)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


C++20 uzantısıyla, şimdi (1) gibi zamandaki bir noktayı doğrudan görüntüleyebilirsiniz. std::chrono::floor zamanı bir güne yuvarlamak std::chrono::sys_days mesafe. Bu değer veri türünü başlatmak için kullanılabilir std::chrono::year_month_day Kullanılacak. Sonunda değeri a'ya dönüştürdüğümde std::chrono::year_month_weekday-bir çeşit takvim, bu özel günün Ekim ayının üçüncü Salı günü olduğu yanıtını alıyorum.

Elbette yıl, ay veya içinde bulunulan gün gibi bileşenlerinde bir takvim tarihi de isteyebilirim (2).

(3) en ilginç satır: İçinde bulunduğumuz yılın Ocak ayının ilk gününü saatlik çözünürlükle güncel tarihten çıkarırsam, yılın başından bu yana geçen saat sayısını elde ederim. Bunun tersine, eğer şimdiki tarihi bir sonraki yılın Ocak ayının ilk gününden (4) çıkarırsam, yeni yıla kadar olan saatleri saatlik çözünürlükle elde ederim. Saatlik çözünürlüğü beğenmediyseniz: (5) ve (6) değerleri günlük çözünürlükte gösterir.








Şimdi doğum günlerimin haftanın günlerini bilmek istiyorum.

Haftanın günlerini sorgulama


Genişletilmiş Chrono kütüphanesi sayesinde belirli bir takvim tarihine ait haftanın gününü sorgulamak oldukça basittir.


// weekdaysOfBirthdays.cpp&#13;
&#13;
#include <chrono>&#13;
#include <cstdlib>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
int y;&#13;
int m;&#13;
int d;&#13;
&#13;
std::cout << "Year: "; // (1)&#13;
std::cin >> y;&#13;
std::cout << "Month: ";&#13;
std::cin >> m;&#13;
std::cout << "Day: ";&#13;
std::cin >> d;&#13;
&#13;
std::cout << 'n';&#13;
&#13;
auto birthday = std::chrono::year(y)/&#13;
std::chrono::month(m)/&#13;
std::chrono::day(d); // (2)&#13;
&#13;
if (not birthday.ok()) { // (3)&#13;
std::cout << birthday << 'n';&#13;
std::exit(EXIT_FAILURE);&#13;
}&#13;
&#13;
std::cout << "Birthday: " << birthday << 'n';&#13;
auto birthdayWeekday = &#13;
std::chrono::year_month_weekday(birthday); // (4)&#13;
std::cout << "Weekday of birthday: " &#13;
<< birthdayWeekday.weekday() << 'n';&#13;
&#13;
auto currentDate = std::chrono::year_month_day(&#13;
std::chrono::floor<std::chrono::days>&#13;
(std::chrono::system_clock::now())); &#13;
auto currentYear = currentDate.year();&#13;
&#13;
auto age = static_cast<int>(currentDate.year()) - &#13;
static_cast<int>(birthday.year()); // (5)&#13;
std::cout << "Your age: " << age << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Weekdays for your next 10 birthdays" &#13;
<< 'n'; &#13;
&#13;
for (int i = 1, newYear = (int)currentYear; &#13;
i <= 10; ++i ) { // (6)&#13;
std::cout << " Age " << ++age << 'n';&#13;
auto newBirthday = std::chrono::year(++newYear)/&#13;
std::chrono::month(m)/&#13;
std::chrono::day(d);&#13;
std::cout << " Birthday: " << newBirthday &#13;
<< 'n';&#13;
std::cout << " Weekday of birthday: " &#13;
<< std::chrono::year_month_weekday(newBirthday).weekday()&#13;
<< 'n';&#13;
}&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Program öncelikle yılı, ayı ve doğum gününü sorar (1). Yapılan girişlere göre takvim tarihi oluşturulur (2) ve geçerliliği kontrol edilir (3). Artık haftanın doğum günü gününü görüyorum. Takvim türünü ayarlamak için takvim tarihini kullanıyorum std::chrono::year_month_weekday (4)'ü doldurun. Etrafında int-Yıl veri türü gösterimini almak için onu girmem gerekiyor int dönüştürün (5). Artık yaşını görebiliyorum. Son olarak, sonraki on doğum gününün (6) her biri için for döngüsü şu bilgileri görüntüler: yaş, takvim tarihi ve haftanın günü. Değişkenlere ihtiyacım var age VE newYear sadece arttır.

İşte doğum günümle ilgili programın bir dizisi.









Sıralı verilerin hesaplanması



Yeni takvim işlevselliğine son bir örnek olarak, Howard Hinnant'ın yeni kronograf işlevselliğinin yaklaşık 40 örneğini içeren çevrimiçi kaynağı Örnekler ve Tarifler'i tanıtmak istiyorum. Chrono uzantısının C++20'de anlaşılması muhtemelen kolay değildir; bu yüzden bu kadar çok örneğe sahip olmak önemli. Bu örnekleri daha sonraki deneyler için bir başlangıç noktası olarak kullanmanız ve böylece anlayışınızı geliştirmeniz önerilir. Ayrıca kendi tariflerinizi de ekleyebilirsiniz.

Örnekler ve tarifler hakkında fikir edinmek için sizi Roland Bock'un sıra verilerini hesaplayan biraz değiştirilmiş bir programıyla tanıştırmak istiyorum.

“Sıralı bir tarih, bir yıl ve yılın bir gününden oluşur (1 Ocak 1. gündür, 31 Aralık 365. gündür veya 366. gündür). Yıl doğrudan yıl_ay_gün'den elde edilebilir. Ve günü hesaplamak son derece kolaydır. Aşağıdaki kodda, yıl_ay_day'ın 0 Ocak gibi geçersiz tarihleri işleyebileceği gerçeğini dikkate alıyoruz:“(Roland Bock)

Gerekli başlıkları Roland programına ekledim.


// ordinalDate.cpp&#13;
&#13;
#include "date.h"&#13;
#include <iomanip>&#13;
#include <iostream>&#13;
&#13;
int main()&#13;
{&#13;
using namespace date;&#13;
&#13;
const auto time = std::chrono::system_clock::now();&#13;
const auto daypoint = floor<days>(time); // (1)&#13;
const auto ymd = year_month_day{daypoint}; &#13;
&#13;
// calculating the year and the day of the year&#13;
const auto year = ymd.year();&#13;
const auto year_day = daypoint - &#13;
sys_days{year/January/0}; // (2)&#13;
// (3)&#13;
std::cout << year << '-' << std::setfill('0') &#13;
<< std::setw(3) << year_day.count() &#13;
<< std::endl;&#13;
&#13;
// inverse calculation and check&#13;
assert(ymd == year_month_day{sys_days{year/January/0} + &#13;
year_day});&#13;
}


Programa bazı yorumlar eklemek istiyorum. (1) mevcut anı kesintiye uğratır. Değer, aşağıdaki satırda bir takvim tarihini başlatmak için kullanılır. (2) Zamandaki iki nokta arasındaki süreyi hesaplayın. Her iki an da günü çözüm olarak kullanıyor. Sonunda orada year_day.count() (3) gün cinsinden zaman dilimi.

Sıradaki ne?


C++20'deki genişletilmiş Chrono kitaplığıyla ilgili makalelerimde önemli bir bileşen hâlâ eksik: saat dilimleri.


(kendim)



Haberin Sonu
 
Üst