C ++ 20'de zaman: Zaman dilimleriyle işyerinde detaylar
Bu makale, Chrono'nun C ++ 20'ye uzatılmasıyla ilgili ayrıntılı yolculuğumun yedincidir:
Sigorta Zamanı
Bir zaman çizelgesi başlangıçta bir bölge ve yaz zamanı veya müşterilerin komisyonu gibi tüm tarih kronolojisidir.
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.
zorluklar
Saat dilimleriyle yüz yüze bazı zorluklar getiriyor:
Zeitze veritabanının kullanımı bir işletim sistemi gerektirir. Bu nedenle, saat dilimi veritabanının bağımsız bir sistemde kullanılması genellikle bir istisnaya yol açar. İşletim sistemi güncellenirken, örneğin yeniden başlatma durumunda saat dilimi veritabanı güncellenir. Bir sistem, yeniden başlatılmadan IANA şov alanının veritabanının güncellenmesini destekliyorsa, mümkündür std::chrono::reload_tzdb() kullanmak. Yeni veritabanı bağlı listenin başında nükleer. Gibi görüldü std::chrono::get_tzdb_list() VEYA std::chrono::get_tzdb() Parsen listenin başlangıcı. Sonuç olarak, veritabanı sorguları güncellenmiş veritabanı öğeleri alır. std::chrono::get_tzdb().version Kullanılan veritabanının sürümünü döndürür.
Zaman çizelgeleri için iki tür temel veri std::chrono::time_zone VE std::chrono::zoned_time.
Olası zaman dilimleri IANA saat dilimi veritabanından önceden tanımlanmıştır. Çağrı std::chrono::current_zone() VE std::chrono::locate_zone(name) Bir işaretçiyi geçerli veya istenen saat dilimine bildirin. Arama std::chrono::locate_zone(name) bir aramaya yol açar name Veritabanında. Arama başarılı değilse, sistem bir tane başlatır std::runtime_error-İstisna.
std::chrono::zoned_time() Zaman içinde bir saat dilimi birleştirin. Bir sistem zamanı veya yerel saati zaman olarak kullanabilirsiniz. Kullanılan bir sistem zamanı std::chrono::system_clock Ve yerel bir saat sahte saat kullanıyor std::chrono::local_t.
İlk örneğim çok basit. UTC saatini ve yerel saati gösterin.
UTC ve yerel saat
UTC veya koordineli evrensel zaman, tüm dünyadaki en önemli zaman standardıdır. Bir bilgisayar, UTC'ye mükemmel bir yaklaşım olan UNIX zamanını kullanır. Unix hava durumu Unix döneminden saniye sayısıdır. Unix-Epoche 1 Ocak 1970'te 00:00:00 UTC'dir.
std::chrono::system_clock::now() (1) aşağıdaki programda verir localTime.cpp Unix'in zamanı önce.
// localTime.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << 'n';
using std::chrono::floor;
std::cout << "UTC time" << 'n'; // (1)
auto utcTime = std::chrono::system_clock::now();
std::cout << " " << utcTime << 'n';
std::cout << " " << floor<std::chrono::seconds>(utcTime)
<< 'n';
std::cout << 'n';
std::cout << "Local time" << 'n'; // (2)
auto localTime =
std::chrono::zoned_time(std::chrono::current_zone(),
utcTime);
std::cout << " " << localTime << 'n';
std::cout << " " << floor<std::chrono::seconds>
(localTime.get_local_time())
<< 'n';
auto offset = localTime.get_info().offset; // (3)
std::cout << " UTC offset: " << offset << 'n';
std::cout << 'n';
}
Programa ekleyecek çok şeyim yok. (1) ile başlayan kod kodu, geçerli saati elde eder, birkaç saniye içinde keser ve gösterir. Arama std::chrono::zoned_time ürün std::chrono::zoned_time localTime. Aşağıdaki arama localTime.get_local_time() Kaydedilen süreyi yerel bir saat olarak döndürür. Bu sefer de birkaç saniye kesildi. localTime (3) Saat dilimi hakkında bilgi almak için de kullanılabilir. Bu durumda, UTC'den sapma ile ilgileniyorum.
Sırada ne var?
Bir sonraki makalem, başka bir saat dilimi öğrettiğimde önemli bir soruyu cevaplar: Çevrimiçi kursuna ne zaman başlamalıyım?
(RME)
C ++ 20'de zaman: Zaman dilimleriyle işyerinde detaylar
Bu makale, Chrono'nun C ++ 20'ye uzatılmasıyla ilgili ayrıntılı yolculuğumun yedincidir:

Sigorta Zamanı
Bir zaman çizelgesi başlangıçta bir bölge ve yaz zamanı veya müşterilerin komisyonu gibi tüm tarih kronolojisidir.

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.
zorluklar
Saat dilimleriyle yüz yüze bazı zorluklar getiriyor:
- Kış zamanı ve yaz: Almanya gibi birçok Avrupa ülkesi yaz ve kış saatini kullanıyor. Yaz saati kışın Almanya'da bir saat önceden.
- Diğer saat dilimleri: Çin veya ABD gibi ülkelerin farklı zaman dilimleri vardır. Örneğin Amerika Birleşik Devletleri'nde, Hawaii'nin standart süresi (UTC-10) ile doğu gündüz (UTC-4) arasında bir fark vardır.
- Saat dilimi farklılıkları: Zaman dilimindeki farklılıklar genellikle saatlerdir, örneğin 30 veya 45 dakika. Avustralya merkezi zamanı UTC+9: 30'dur ve Avustralya Merkez Batı Standart Saati UTC+8: 45'tir.
- Saat diliminin kısaltmaları belirsizdir: ADT, Arap gündüz (UTC+4) veya Atlantik'in gündüz zamanı (UTC-3) olabilir.

Zeitze veritabanının kullanımı bir işletim sistemi gerektirir. Bu nedenle, saat dilimi veritabanının bağımsız bir sistemde kullanılması genellikle bir istisnaya yol açar. İşletim sistemi güncellenirken, örneğin yeniden başlatma durumunda saat dilimi veritabanı güncellenir. Bir sistem, yeniden başlatılmadan IANA şov alanının veritabanının güncellenmesini destekliyorsa, mümkündür std::chrono::reload_tzdb() kullanmak. Yeni veritabanı bağlı listenin başında nükleer. Gibi görüldü std::chrono::get_tzdb_list() VEYA std::chrono::get_tzdb() Parsen listenin başlangıcı. Sonuç olarak, veritabanı sorguları güncellenmiş veritabanı öğeleri alır. std::chrono::get_tzdb().version Kullanılan veritabanının sürümünü döndürür.
Zaman çizelgeleri için iki tür temel veri std::chrono::time_zone VE std::chrono::zoned_time.
Olası zaman dilimleri IANA saat dilimi veritabanından önceden tanımlanmıştır. Çağrı std::chrono::current_zone() VE std::chrono::locate_zone(name) Bir işaretçiyi geçerli veya istenen saat dilimine bildirin. Arama std::chrono::locate_zone(name) bir aramaya yol açar name Veritabanında. Arama başarılı değilse, sistem bir tane başlatır std::runtime_error-İstisna.
std::chrono::zoned_time() Zaman içinde bir saat dilimi birleştirin. Bir sistem zamanı veya yerel saati zaman olarak kullanabilirsiniz. Kullanılan bir sistem zamanı std::chrono::system_clock Ve yerel bir saat sahte saat kullanıyor std::chrono::local_t.
İlk örneğim çok basit. UTC saatini ve yerel saati gösterin.
UTC ve yerel saat
UTC veya koordineli evrensel zaman, tüm dünyadaki en önemli zaman standardıdır. Bir bilgisayar, UTC'ye mükemmel bir yaklaşım olan UNIX zamanını kullanır. Unix hava durumu Unix döneminden saniye sayısıdır. Unix-Epoche 1 Ocak 1970'te 00:00:00 UTC'dir.
std::chrono::system_clock::now() (1) aşağıdaki programda verir localTime.cpp Unix'in zamanı önce.
// localTime.cpp
#include <chrono>
#include <iostream>
int main() {
std::cout << 'n';
using std::chrono::floor;
std::cout << "UTC time" << 'n'; // (1)
auto utcTime = std::chrono::system_clock::now();
std::cout << " " << utcTime << 'n';
std::cout << " " << floor<std::chrono::seconds>(utcTime)
<< 'n';
std::cout << 'n';
std::cout << "Local time" << 'n'; // (2)
auto localTime =
std::chrono::zoned_time(std::chrono::current_zone(),
utcTime);
std::cout << " " << localTime << 'n';
std::cout << " " << floor<std::chrono::seconds>
(localTime.get_local_time())
<< 'n';
auto offset = localTime.get_info().offset; // (3)
std::cout << " UTC offset: " << offset << 'n';
std::cout << 'n';
}
Programa ekleyecek çok şeyim yok. (1) ile başlayan kod kodu, geçerli saati elde eder, birkaç saniye içinde keser ve gösterir. Arama std::chrono::zoned_time ürün std::chrono::zoned_time localTime. Aşağıdaki arama localTime.get_local_time() Kaydedilen süreyi yerel bir saat olarak döndürür. Bu sefer de birkaç saniye kesildi. localTime (3) Saat dilimi hakkında bilgi almak için de kullanılabilir. Bu durumda, UTC'den sapma ile ilgileniyorum.

Sırada ne var?
Bir sonraki makalem, başka bir saat dilimi öğrettiğimde önemli bir soruyu cevaplar: Çevrimiçi kursuna ne zaman başlamalıyım?
(RME)