C++20'de Saat: Saat dilimlerinin kullanımına ilişkin ayrıntılar

Adanali

Active member
C++20'de Saat: Saat dilimlerinin kullanımına ilişkin ayrıntılar


  1. C++20'de Saat: Saat dilimlerinin kullanımına ilişkin ayrıntılar

Bu makale, C++20'deki Chrono uzantısıyla ilgili ayrıntılı yolculuğumun yedincisidir:

Duyuru









Zaman dilimleri


Bir saat dilimi her şeyden önce bir bölge ve onun yaz saati uygulaması veya artık saniyeler gibi tüm tarih geçmişidir.







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.







zorluklar


Saat dilimlerini yönetmek bazı zorlukları beraberinde getirir:

  • Kış saati ve yaz saati: Almanya gibi birçok Avrupa ülkesi yaz saati ve standart saat olarak adlandırılan saati kullanır. Almanya'da yaz saati uygulaması kış saatinden bir saat ileridir.
  • Diğer saat dilimleri: Çin veya Amerika Birleşik Devletleri gibi ülkelerin farklı saat dilimleri vardır. Örneğin Amerika Birleşik Devletleri'nde Hawaii Standart Saati (UTC-10) ile Doğu Yaz Saati (UTC-4) arasında altı saatlik bir fark vardır.
  • Saat dilimi farklılıkları: Saat dilimi farklılıkları genellikle 30 veya 45 dakika gibi saatlerin kesirleri kadardır. Orta Avustralya saati UTC+9:30, Batı Orta Avustralya Standart Saati ise UTC+8:45'tir.
  • Saat dilimi kısaltmaları belirsizdir: ADT, Arap Yaz Saati (UTC+4) veya Atlantik Yaz Saati (UTC-3) olabilir.
C++20 Zaman Dilimi Kitaplığı, IANA zaman dilimi veritabanının eksiksiz bir ayrıştırıcısıdır. Aşağıdaki tablo, yeni işlevsellik hakkında ilk izlenimi vermeyi amaçlamaktadır.








Saat dilimi veritabanını kullanmak bir işletim sistemi gerektirir. Bu nedenle, saat dilimi veritabanını bağımsız bir sistemde kullanmak genellikle bir istisna oluşturur. Saat dilimi veritabanı, yeniden başlatma gibi işletim sistemi güncellemeleri sırasında güncellenir. Bir sistem, IANA saat dilimi veritabanının yeniden başlatmaya gerek kalmadan güncellenmesini destekliyorsa bu yapılabilir std::chrono::reload_tzdb() kullanım. Yeni veritabanı atomik olarak bağlantılı listenin en üstüne yerleştirilir. Şu şekilde ara: std::chrono::get_tzdb_list() VEYA std::chrono::get_tzdb() Listenin başlangıcını analiz edin. Sonuç olarak, veritabanı sorguları güncellenmiş veritabanı girişlerini alır. std::chrono::get_tzdb().version kullanılan veritabanının sürümünü döndürür.

Zaman dilimleri için iki temel veri türü şunlardır: std::chrono::time_zone VE std::chrono::zoned_time.

Olası zaman dilimleri, IANA zaman dilimi veritabanından önceden tanımlanmıştır. çağrılar std::chrono::current_zone() VE std::chrono::locate_zone(name) geçerli saat dilimine veya istenen saat dilimine ada göre bir işaretçi döndürür. Arama std::chrono::locate_zone(name) aramaya yol açar name veritabanında. Arama başarısız olursa sistem bir arama başlatır. std::runtime_error-İstisna.

std::chrono::zoned_time() zaman içindeki bir noktayla birlikte bir zaman dilimini temsil eder. Zaman noktası olarak bir sistem zaman noktasını veya yerel bir zaman noktasını kullanabilirsiniz. Bir sistem zaman noktası kullanılıyor std::chrono::system_clock ve yerel saat sahte saati kullanır std::chrono::local_t.

İlk örneğim çok basit. UTC saatini ve yerel saati görüntüler.

UTC saati ve yerel saat


UTC veya Koordineli Evrensel Saat dünya çapında en önemli zaman standardıdır. Bir bilgisayar, UTC'nin çok iyi bir tahmini olan Unix zamanını kullanır. UNIX zamanı, Unix döneminden bu yana geçen saniye sayısıdır. Unix dönemi 1 Ocak 1970'de 00:00:00 UTC'dir.

std::chrono::system_clock::now() (1)'de aşağıdaki program verilmektedir localTime.cpp Unix zamanı geri döndü.


// localTime.cpp

#include <chrono>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
using std::chrono::floor;&#13;
&#13;
std::cout << "UTC time" << 'n'; // (1) &#13;
auto utcTime = std::chrono::system_clock::now();&#13;
std::cout << " " << utcTime << 'n';&#13;
std::cout << " " << floor<std::chrono::seconds>(utcTime) &#13;
<< 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "Local time" << 'n'; // (2) &#13;
auto localTime = &#13;
std::chrono::zoned_time(std::chrono::current_zone(),&#13;
utcTime);&#13;
&#13;
std::cout << " " << localTime << 'n';&#13;
std::cout << " " << floor<std::chrono::seconds>&#13;
(localTime.get_local_time()) &#13;
<< 'n';&#13;
&#13;
auto offset = localTime.get_info().offset; // (3) &#13;
std::cout << " UTC offset: " << offset << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Programa ekleyecek pek bir şeyim yok. (1) ile başlayan kod bloğu güncel saati alır, saniyelere böler ve görüntüler. Arama std::chrono::zoned_time oluşturulan std::chrono::zoned_time localTime. Bir sonraki çağrı localTime.get_local_time() kaydedilen saati yerel saat olarak döndürür. Bu sefer de saniyeler içinde kesiliyor. localTime (3) saat dilimi bilgisini almak için de kullanılabilir. Bu durumda UTC'den sapmayla ilgileniyorum.








Sıradaki ne?


Bir sonraki makalem, farklı bir saat diliminde ders verirken önemli bir soruyu yanıtlıyor: Çevrimiçi kursuma ne zaman başlamalıyım?


(kendim)



Haberin Sonu
 
Üst