C++20'de saat dilimleri: çevrimiçi dersler | merhaba çevrimiçi

Adanali

Active member
C++20'de saat dilimleri: çevrimiçi dersler | merhaba çevrimiçi
Bu makale, C++20'deki Chrono uzantısıyla ilgili ayrıntılı yolculuğumun sekizincisidir:

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.







Çevrimiçi dersler için farklı zaman dilimleri


program onlineClass.cpp şu soruyu yanıtlıyor: Çevrimiçi bir kursa yerel saatle (Almanya) 7:00, 13:00 veya 17:00'de başlarsam belirli saat dilimlerinde saat kaçtır?

Çevrimiçi kursun 1 Şubat 2021'de başlaması planlanıyor ve 4 saat sürecek. Yaz saati uygulaması nedeniyle takvim tarihi doğru cevaba ulaşmak için önemlidir.


#include <chrono>&#13;
#include <algorithm>&#13;
#include <iomanip>&#13;
#include <iostream>&#13;
&#13;
using namespace std::chrono_literals;&#13;
&#13;
template <typename ZonedTime>&#13;
auto getMinutes(const ZonedTime& zonedTime) { // (1) &#13;
return std::chrono::floor<std::chrono::minutes>(zonedTime.get_local_time());&#13;
}&#13;
&#13;
void printStartEndTimes(const std::chrono::local_days& localDay, // (2) &#13;
const std::chrono::hours& h, &#13;
const std::chrono::hours& durationClass,&#13;
const std::initializer_list<std::string>& timeZones ) {&#13;
&#13;
std::chrono::zoned_time startDate{std::chrono::current_zone(), localDay + h}; // (4) &#13;
std::chrono::zoned_time endDate{std::chrono::current_zone(), &#13;
localDay + h + durationClass};&#13;
std::cout << std::format("Local time: [{}, {}]n", getMinutes(startDate), getMinutes(endDate));&#13;
&#13;
auto longestStringSize = std::max(timeZones, [](const std::string& a, // (5) &#13;
const std::string& b) { return a.size() < b.size(); }).size();&#13;
&#13;
std::string formatTimeZones = " {0:<{3}} [{1}, {2}]n"; // (7) &#13;
for (auto timeZone: timeZones) { // (6) &#13;
std::cout << std::vformat(formatTimeZones, std::make_format_args(timeZone, &#13;
getMinutes(std::chrono::zoned_time(timeZone, startDate)),&#13;
getMinutes(std::chrono::zoned_time(timeZone, endDate)),&#13;
longestStringSize + 1)); &#13;
}&#13;
}&#13;
&#13;
int main() {&#13;
&#13;
using namespace std::string_literals;&#13;
&#13;
std::cout << 'n';&#13;
&#13;
constexpr auto classDay{std::chrono::year(2021)/2/1};&#13;
constexpr auto durationClass = 4h;&#13;
auto timeZones = {"America/Los_Angeles"s, "America/Denver"s, &#13;
"America/New_York"s, "Europe/London"s, &#13;
"Europe/Minsk"s, "Europe/Moscow"s, &#13;
"Asia/Kolkata"s, "Asia/Novosibirsk"s, &#13;
"Asia/Singapore"s, "Australia/Perth"s, &#13;
"Australia/Sydney"s};&#13;
&#13;
for (auto startTime: {7h, 13h, 17h}) { // (3) &#13;
printStartEndTimes(std::chrono::local_days{classDay}, startTime, &#13;
durationClass, timeZones);&#13;
std::cout << 'n';&#13;
}&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Özelliklere geçmeden önce getMinutes (satır 1) e printStartEndTimes (satır 2), konuyla ilgili birkaç söz söylemek istiyorum. main– İşlevselliği kaybedersiniz. THE main-Fonksiyon dersin gününü, dersin süresini ve tüm zaman dilimlerini ayarlar. Son olarak aralık tabanlı olarak geçer for-Çevrimiçi bir kurs için olası tüm başlangıç noktalarını takip edin (satır 3). Bu fonksiyon sayesinde gerekli tüm bilgiler görüntülenir (satır 2).

Satır (4) ile başlayan birkaç satır bunu hesaplar startDate VE endDate Dersin başlangıç ve süresini takvim tarihine ekleyerek eğitimimi düzenleyebilirim. Her iki değer de fonksiyon kullanılarak elde edilir getMinutes (Satır 1). std::floor<std::chrono::minutes>(zonedTime.get_local_time()) zaman tasarrufu sağlıyor std::chrono::zoned_time ve değeri dakika başına çözünürlüğe kısaltır. Program çıktısını doğru şekilde hizalamak için (5) satırı, en uzun zaman dilimi adının boyutunu belirler. Satır (6) tüm zaman dilimleri arasında gezinir ve adlarının yanı sıra her çevrimiçi dersin başlangıcını ve bitişini görüntüler. Hatta bazı takvim tarihleri günlük sınırları bile aşıyor.

7. satırdaki biçim dizesi” {0:<{3}} [{1}, {2}]n” birkaç kelimeyi hak ediyor. Bu lValue, işlevler gerektirir std::vformat VE std::make_format_args. Biçim dizesindeki sayı, bağımsız değişkenlerdeki konumu temsil eder. THE {3} daha uzun saat dilimi adı için yer tutucudur.

Sıradaki ne?


Chrono I/O, kronotiplerin okunması ve yazılmasından oluşur. Farklı veri türleri ham yazmayı ve yeni biçimlendirme kitaplığıyla biçimlendirilmiş yazmayı destekler. Bu kütüphanenin aynı zamanda işlevi de var std::chrono::parse()bu da okumayı çok güçlü bir akıştan yapar.


()



Haberin Sonu
 
Üst