C++20'de Saat: Günün saati ve takvim tarihi için yeni veri türleri

Adanali

Member


  1. C++20'de Saat: Günün saati ve takvim tarihi için yeni veri türleri

Günün saati


Duyuru



Krono işlevselliği için temel veri türleri hakkındaki makalelerden sonra bu kez C++20'de yeni bir veri türünü ele alacağım.







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.













std::chrono::hh_mm_ss gece yarısından bu yana geçen süredir; saat, dakika, saniye ve saniyenin kesirlerine bölünmüştür. Bu veri türü genellikle bir biçimlendirme aracı olarak kullanılır. Aşağıdaki tablo başlangıçta kısa bir genel bakış sunmaktadır. std::chrono::hh_mm_sörneği tOfDay.








Kullanılan süreye bağlı olarak statik üye uygun olanı döndürür tOfDay.fractional_width. Eğer böyle bir değer mevcut değilse fractional_width Bölgede [0, 18]var, öyle fractional_width 6'ya eşittir. Örneğin bkz. std::chrono::duration<int, std::ratio<1, 3>> aşağıdaki tabloda.








Veri türünün kullanımı std::chrono::hh_mm_ss Gerçekten çok kolay.


// timeOfDay.cpp&#13;
&#13;
#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
using namespace std::chrono_literals; &#13;
&#13;
std::cout << std::boolalpha << 'n';&#13;
&#13;
auto timeOfDay = &#13;
std::chrono::hh_mm_ss(10.5h + 98min + 2020s + 0.5s); // (1)&#13;
&#13;
std::cout<< "timeOfDay: " << timeOfDay << 'n'; // (2)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "timeOfDay.hours(): " &#13;
<< timeOfDay.hours() << 'n'; // (4)&#13;
std::cout << "timeOfDay.minutes(): " &#13;
<< timeOfDay.minutes() << 'n'; // (4)&#13;
std::cout << "timeOfDay.seconds(): " &#13;
<< timeOfDay.seconds() << 'n'; // (4)&#13;
std::cout << "timeOfDay.subseconds(): " &#13;
<< timeOfDay.subseconds() << 'n'; // (4)&#13;
std::cout << "timeOfDay.to_duration(): " &#13;
<< timeOfDay.to_duration() << 'n'; // (5)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "std::chrono::hh_mm_ss(45700.5s): " &#13;
<< std::chrono::hh_mm_ss(45700.5s) << 'n'; // (6)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "std::chrono::is_am(5h): " &#13;
<< std::chrono::is_am(5h) << 'n'; // (7) &#13;
std::cout << "std::chrono::is_am(15h): " &#13;
<< std::chrono::is_am(15h) << 'n'; // (7)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "std::chrono::make12(5h): " &#13;
<< std::chrono::make12(5h) << 'n'; // (7) &#13;
std::cout << "std::chrono::make12(15h): " &#13;
<< std::chrono::make12(15h) << 'n'; // (7) &#13;
}


(1)'de yeni bir örnek oluşturuyorum std::chrono::hh_mm_ss: timeOfDay. C++14'ün Chrono değişmezleri sayesinde, Günün Saati nesnesini başlatmak için bazı zaman süreleri ekleyebilirim. C++20 ile şunları yapabilirsiniz timeOfDay doğrudan çıkın (2). Geri kalanının okunması kolay olmalıdır. (4) gece yarısından bu yana geçen sürenin bileşenlerini saat, dakika, saniye ve saniyenin kesirleri cinsinden döndürür. (5) gece yarısından bu yana geçen süreyi saniye cinsinden döndürür. (6) daha ilginçtir: gösterilen saniyeler (2)'de gösterilen zamana karşılık gelir. (7) belirtilen saatin sabah olup olmadığını döndürür. (8) son olarak belirtilen zamanın 12 saatlik eşdeğerini döndürür.

İşte programın çıktısı:








Takvim tarihi


C++20'deki Chrono uzantısındaki yeni bir veri türü takvim tarihidir. C++20, takvim tarihi oluşturmanın ve onunla etkileşimde bulunmanın çeşitli yollarını destekler. Öncelikle takvimdeki bir tarih nasıl görünür?

  • A Takvim tarihi Bir yıl, bir ay ve bir günden oluşur. Bu nedenle C++20'de özel bir veri türü vardır. std::chrono::year_month_day. C++20'nin sunabileceği çok daha fazlası var. Aşağıdaki tablo, farklı kullanım durumlarını göstermeden önce takvim türlerine genel bir bakış sağlamayı amaçlamaktadır.







sayesinde Güzel sözdizimi yapabilirsiniz std::chrono::eek:perator / Gregoryen takvim tarihleri oluşturmak için kullanın.

Takvim veri türleri çeşitli işlemleri destekler. Aşağıdaki tabloda genel bir bakış sunulmaktadır. Okunabilirlik nedeniyle ad alanını kısmen görmezden geliyorum std::chrono.








Arttırma ve eksiltme işlemleri ++/-- önek ve sonek sürümlerinde desteklenir. Toplama veya çıkarma +/- veri türü nesneleri gerektirir std::chrono::duration. Yani, veri tipindeki iki nesne arasındaki farkı alırsanız std::chrono::day formda, türünde bir nesne elde edersiniz std::chrono::days. <=> yeni üç yollu karşılaştırma operatörüdür.

Aşağıdaki program takvim türleri için işlemleri kullanır:


// calendarOperations.cpp&#13;
&#13;
#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
using std::chrono::Monday;&#13;
using std::chrono::Saturday;&#13;
&#13;
using std::chrono::March;&#13;
using std::chrono::June;&#13;
using std::chrono::July;&#13;
&#13;
using std::chrono::days;&#13;
using std::chrono::months;&#13;
using std::chrono::years;&#13;
&#13;
using std::chrono::last;&#13;
&#13;
using namespace std::chrono_literals;&#13;
&#13;
std::cout << std::boolalpha;&#13;
&#13;
std::cout << "March: " << March << 'n'; &#13;
std::cout << "March + months(3): " &#13;
<< March + months(3) << 'n'; // (1)&#13;
std::cout << "March - months(25): " &#13;
<< March - months(25) << 'n'; // (5) &#13;
std::cout << "July - June: " << July - June &#13;
<< 'n'; // (6)&#13;
std::cout << "June < July: " << (June < July) << 'n'; // (7)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Saturday: " << Saturday << 'n';&#13;
std::cout << "Saturday + days(3): " &#13;
<< Saturday + days(3) << 'n'; // (2)&#13;
std::cout << "Saturday - days(22): " &#13;
<< Saturday - days(22) << 'n'; // (8)&#13;
std::cout << "Saturday - Monday: " &#13;
<< Saturday - Monday << 'n'; // (9)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "2021y/March: " << 2021y/March << 'n'; // (3)&#13;
std::cout << "2021y/March + years(3) - months(35): " // (10)&#13;
<< 2021y/March + years(3) - months(35) << 'n';&#13;
std::cout << "2022y/July - 2021y/June: " &#13;
<< 2022y/July - 2021y/June << 'n'; // (11)&#13;
std::cout << "2021y/June > 2021y/July: " &#13;
<< (2021y/June > 2021y/July) << 'n'; // (12)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "2021y/March/Saturday[last]: " &#13;
<< 2021y/March/Saturday[last] << 'n'; // (4)&#13;
std::cout << "2021y/March/Saturday[last] + months(13) " +&#13;
"+ years(3): " &#13;
<< 2021y/March/Saturday[last] + &#13;
months(13) + years(3) << 'n';&#13;
std::cout << "2021y/July/Saturday[last] - months(1) == " + &#13;
" 2021y/June/Saturday[last]: "&#13;
<< (2021y/July/Saturday[last] - months(1) == &#13;
2021y/June/Saturday[last]) &#13;
<< 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Program işlemleri gerçekleştirir std::chrono::month (1), std::chrono::weekday (2), std::chrono::year_month (3) e std::chrono::year_month_weekday_last (4) aracılığıyla.








Zaman dilimini eklerken veya çıkarırken std::chrono::months Modulo işlemleri otomatik olarak uygulanır (5 ve 6). İkinin çıkarılması std::chrono::month-Ürünler 1 aya eşdeğerdir. Bir ay önce 2629746 Saniye (7). Buna göre bir zaman dilimi belirleyebilirsiniz. std::chrono::days takvim verilerine std::chrono::day bunlara ekleyin veya çıkarın (8 ve 9). İkinin çıkarılması std::chrono::day-Nesneler bir sonuçla sonuçlanır std::chrono::days-Nesne. std::chrono::year_month çıkarma (10), fark (11) ve zaman noktalarının karşılaştırılmasını (12) sağlar. Nesneleri yazın std::chrono::weekday_last zaman aralıklarının eklenmesini/çıkarılmasını etkinleştir std::chrono::months VE std::chrono::years. Ayrıca, bunlar std::chrono::weekday_last-Nesneler birbirleriyle karşılaştırılabilir.

Sıradaki ne?


C++20, veri türleriyle çalışmayı daha kolay hale getirmek için sabitleri ve değişmez değerleri destekler.


(kendim)



Haberin Sonu
 
Üst