C++20'de Zaman: Kronometrik terminolojiye giriş

Adanali

Active member
C++20'de Zaman: Kronometrik terminolojiye giriş


  1. C++20'de Zaman: Kronometrik terminolojiye giriş

Temel olarak, zaman dilimi işlevi (C++20), takvim işlevine (C++20) dayanır ve bu da kronograf işlevine (C++11) dayanır. Bu nedenle, bu temel kronografik terminoloji C++11'in üç bileşeni olan zaman, süre ve saat ile başlar.

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 kronometrik terminoloji

  • A zaman onun bir başlangıç noktası, yani çağ adı verilen bir noktası ve çağdan itibaren daha ileri bir zaman dilimi vardır.
  • Bir Süre zamandaki iki nokta arasındaki farktır. Saatteki tik-tak sayısı zamanın uzunluğunu belirler.
  • Bir Saat bir başlangıç noktası (dönem) ve mevcut anı hesaplamak için bir onay işareti bulunur.
Zamanları çıkarmak size bir süre verir. Zamandaki bir noktaya bir zaman dilimi eklediğinizde yeni bir zaman noktası elde edersiniz. Bir yıl, saatin tipik hassasiyeti ve zamanın uzunluğunun ölçümüdür.

C programlama dilinin babası olan 2011 yılında ölen Dennis Ritchie'nin hayatını tanıtmak için bu üç kavramı kullanacağım. Basitlik açısından sadece yıllarla ilgileniyorum.








Dennis Ritchie 70 yaşındaydı. İsa'nın doğuşu çağdır. Dönemi zaman dilimiyle birleştirirsem 1941 ve 2011 zamanlarını elde ederim. 1941 saatini 2011'den çıkarmak, zaman dilimini yıllık hassasiyetle verir.

C++11 üç saate sahiptir std::chrono::system_clock, std::chrono::steady_clock VE std::chrono::high_resolution_clock. Zaman süresi pozitif ve negatif olabilir. Üç saatin her birinin üyelik işlevi vardır nowgeçerli saati döndürür.

Zaman, süre ve saat hakkında daha fazla bilgiyi önceki makalelerimde bulabilirsiniz:

C++20, Chrono kitaplığına yeni bileşenler ekler:

  • THE Günün saati gece yarısından bu yana geçen sürenin saat, dakika, saniye ve saniyenin kesirlerine bölünmesiyle elde edilen süredir.
  • takvim yıl, ay, haftanın günü veya haftanın n'inci günü gibi çeşitli takvim tarihlerini temsil eder.
  • Bir Jet lag Belirli bir coğrafi bölgedeki belirli bir anı temsil eder.
  • Bir Zaman bölgelere bölünmüş Zamandaki bir noktayı bir zaman dilimiyle birleştirir.
Zaman bir gizemdir


Doğrusunu söylemek gerekirse zaman benim için bir gizem. Bir yandan her birimizin sezgisel bir zaman fikri var ama diğer yandan bunu resmi olarak tanımlamak son derece zor. Örneğin zaman, süre ve saatin üç bileşeni birbirine bağlıdır.

Öncelikle temel veri türlerini ve değişmez değerlerini tanıtmak istiyorum.

Temel ve değişmez türler


Eksiksiz olması açısından bu bölüm, önceki C++ standartlarından temel veri türlerini ve değişmez değerleri içerir.

Saatler


Duvar saatinin yanında std::chrono::system_clockmonoton saat std::chrono::steady_clock ve en doğru saat std::chrono::high_resolution_clock C++11'de C++20 beş saat daha biliyor. Aşağıdaki tablo tüm C++ saatlerinin özelliklerini ve çağlarını göstermektedir.








Saatler std::chrono::steady_clock VE std::chrono::file_clock bunların uygulanması için belirli bir zamanları vardır. çağları std::chrono::system_clock, std::chrono::gps_clock, std::chrono::tai_clock VE std::chrono::utc_clock 00:00:00'da başlayacak. std::chrono::file_clock dosya sistemi girişlerinin saatidir.

Ek olarak, C++11 destekler std::chrono::high_resolution_clock. Bu saat tüm uygulamalarda uygulanmaz ve yalnızca bir takma addır. std::chrono::steady_clock VEYA std::chrono::high_resolution_clock.

Zamandaki bir nokta saatler arasında dönüştürülebilir.

Saatler arasında zamanların dönüştürülmesi

İşlev std::chrono::clock_cast bir çağa sahip saatler arasında süreleri dönüştürür. Bunlar saatler std::chrono::system_clock, std::chrono::utc_clock, std::chrono::gps_clock VE std::chrono::tai_clock. Ayrıca destekleniyor std::chrono::file_clock dönüşüm.

Aşağıdaki program zamanı dönüştürür 2021-8-5 17:00:00 farklı saatler arasında.


// convertClocks.cpp

#include <iostream>&#13;
#include <sstream>&#13;
#include <chrono>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
using namespace std::literals;&#13;
&#13;
std::chrono::utc_time<std::chrono::utc_clock::duration>&#13;
timePoint;&#13;
std::istringstream{"2021-8-5 17:00:00"} &#13;
>> std::chrono::parse("%F %T"s, timePoint);&#13;
&#13;
auto timePointUTC &#13;
= std::chrono::clock_cast<std::chrono::utc_clock>(timePoint);&#13;
std::cout << "UTC_time: " &#13;
<< std::format("{:%F %X %Z}", timePointUTC) << 'n';&#13;
&#13;
auto timePointSys = &#13;
std::chrono::clock_cast<std::chrono::system_clock>(timePoint);&#13;
std::cout << "sys_time: " &#13;
<< std::format("{:%F %X %Z}", timePointSys) << 'n';&#13;
&#13;
auto timePointFile = &#13;
std::chrono::clock_cast<std::chrono::file_clock>(timePoint);&#13;
std::cout << "file_time: " &#13;
<< std::format("{:%F %X %Z}", timePointFile) << 'n';&#13;
&#13;
auto timePointGPS = &#13;
std::chrono::clock_cast<std::chrono::gps_clock>(timePoint);&#13;
std::cout << "GPS_time: " &#13;
<< std::format("{:%F %X %Z}", timePointGPS) << 'n';&#13;
&#13;
auto timePointTAI = &#13;
std::chrono::clock_cast<std::chrono::tai_clock>(timePoint);&#13;
std::cout << "TAI_time: " &#13;
<< std::format("{:%F %X %Z}", timePointTAI) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


İşlev std::chrono::parse Chrono nesnesini akıştan ayrıştırır. Aşağıdaki satırlarda yürüyün std::chrono::clock_cast THE timePoint belirtilen saatte. Aşağıdaki satır, tarihin (%F), yerel saatin temsili (%X) ve saat dilimi kısaltması (%Z) belirtilebilir. Sonraki makalelerimden biri format dizesini daha derinlemesine inceleyecek.








Sonuç bazılarını şaşırtacak: GPS zamanı UTC saatinden 18 saniye ileridedir. TAI zamanı UTC saatinden 37 saniye, GPS saatinden 19 saniye ileridedir.

Sıradaki ne?


Bir sonraki yazımda süreleri ve zaman içindeki noktaları olan veri türleri arasındaki yolculuğuma devam edeceğim.


(kendim)



Haberin Sonu
 
Üst