C ++ 20: Takvim Veri Sorgusu ve Sıralı Veriler

Adanali

Active member
C ++ 20: Takvim Veri Sorgusu ve Sıralı Veriler


  1. C ++ 20: Takvim Veri Sorgusu ve Sıralı Veriler

Bu makale, Chrono'nun C ++ 20'ye uzatılmasıyla ilgili ayrıntılı yolculuğumun altıncıdır:













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.







Questo takvim verileri


Aşağıdaki program queryCalendarDates.cpp Hızlı bir şekilde bazı takvim verileri 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 genişlemesi ile, bir kez doğrudan görüntülenebilir, örneğin şimdi (1). std::chrono::floor Bir gün için zaman ayırın std::chrono::sys_days mesafe. Bu değer, veri türünü başlatmak için kullanılabilir std::chrono::year_month_day kullanılabilir. Sonunda birinde takdir ettiğimde std::chrono::year_month_weekday-Salendar Türü, bu özel günün Ekim ayının üçüncü Salı olduğu cevabını alıyorum.

Tabii ki, yıl veya gün süren yıl gibi bileşenlerinde bir takvim tarihi de isteyebilirim (2).

(3) Bu en ilginç çizgi: cari tarihten cari tarihten 1 Ocak'ta cari tarihten itibaren, yıl başından itibaren saat sayısını alacağım. Aksine, önümüzdeki yıl 1 Ocak'tan (4) cari tarihi çıkarırsam, karar zamanı ile yeni yıla kadar saatleri alacağım. Zaman çözünürlüğünü sevmiyorsanız: (5) ve (6), değerleri günlük çözünürlükte gösterin.








Şimdi doğum günümün günlerini bilmek istiyorum.

Haftanın günleri sorusu


Chrono geniş kütüphanesi sayesinde, takvimin belirli bir tarihinin hafta içi sorgulamak oldukça kolaydır.


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


Her şeyden önce, program yaklaşık yıl, ay ve doğum günü ister (1). Öğeler (2) temelinde bir takvim tarihi oluşturulur ve geçerliliği (3) için doğrulanmıştır. Şimdi doğum günü hafta içi göster. Takvim tarihini takvim türüne kullanıyorum std::chrono::year_month_weekday (4) doldurmak için. Etrafında int-D veri türünün temsili, borçluyum int Dönüştürme (5). Şimdi yaş gösterebilirim. Son olarak, sonraki on doğum gününün her biri için döngü (6) aşağıdaki bilgileri göstermektedir: yaş, takvim tarihi ve haftanın günü. Değişkenler borçluyum age VE newYear Sadece artış.

İşte doğum günümle programın yürütülmesi.









Sıralı verileri hesapla



Takvimin yeni işlevinin son bir örneği olarak, yeni CHSSO özelliklerine yaklaşık 40 örnek içeren Howard Hinnant'ın çevrimiçi kaynaklarının örneklerini ve tariflerini sunmak istiyorum. C ++ 20'de Chrono'nun genişlemesinin anlaşılması muhtemelen kolay değildir; Bu yüzden çok fazla örneğe sahip olmak önemlidir. Bu örneklerin daha ileri deneyler için bir başlangıç noktası olarak kullanılması ve bu nedenle bunun anlayışını geliştirmeniz tavsiye edilir. Tariflerinizi de ekleyebilirsiniz.

Örnekler ve tarifler hakkında bir izlenim edinmek için, sıralı verileri hesaplayarak Roland Bock tarafından biraz değiştirilmiş bir program sunmak istiyorum.

“Sıralı tarihte bir yıl ve yılın bir gününden oluşur (1 Ocak 1 gün, 31 Aralık Bing Günü 365 veya 366. gün). Yıl doğrudan yıl_mont_day tarafından gösterilir. Ve günün hesaplanması harika bir şekilde kolaydır.“(Roland Bock)

Roland programına gerekli başlığı 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) Güncel saati kesin. Değer, bir takvim tarihini başlatmak için aşağıdaki satırda kullanılır. (2) Dönemi iki kez hesaplayın. Her iki kez de günü bir çözüm olarak kullanır. Sonunda verir year_day.count() (3) Günlerde zamanın süresi.

Sırada ne var?


C ++ 20: zaman dilimlerine kadar uzanan Chrono kütüphanesindeki makalelerimde önemli bir bileşen hala eksik.


(RME)
 
Üst