Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah cara saya mengekstrak komponen temporal dari std::chrono::time_point?
Mengekstrak Komponen Temporal daripada std::chrono::time_point
Untuk system_clock::time_points, std::chrono library tidak secara langsung menyediakan fungsi untuk mengekstrak komponen temporal seperti tahun, bulan, dan hari. Walau bagaimanapun, adalah mungkin untuk mendapatkan semula komponen ini dengan mengeksploitasi hubungan asas antara jam sistem dan kalendar sivil.
Mengekstrak Komponen Menggunakan Perpustakaan C
Satu kaedah melibatkan penukaran titik_masa kepada time_t, mewakili bilangan saat sejak Tahun Baru 1970 dalam zon waktu UTC. Menggunakan fungsi manipulasi masa perpustakaan C, anda kemudiannya boleh menukar time_t kepada struktur tm, yang mengandungi komponen seperti tahun, bulan dan hari. Kod berikut menunjukkan pendekatan ini:
<code class="cpp">system_clock::time_point now = system_clock::now(); time_t tt = system_clock::to_time_t(now); tm utc_tm = *gmtime(&tt); // Convert to UTC time std::cout << utc_tm.tm_year + 1900 << '\n'; std::cout << utc_tm.tm_mon + 1 << '\n'; std::cout << utc_tm.tm_mday << '\n';
Mengekstrak Komponen Masa Epoch Unix
Komponen yang tepat boleh diperolehi dengan mengenali bahawa kebanyakan jam sistem yang digunakan dalam sistem moden adalah berasaskan pada masa zaman Unix, yang mewakili bilangan saat sejak 1 Januari 1970 UTC. Walaupun std::chrono tidak menyediakan kaedah untuk mengakses nilai ini secara langsung, adalah mungkin untuk mengekstrak komponen dengan menolak daripada jumlah masa yang berlalu sejak zaman itu.
<code class="cpp">typedef duration<int, ratio_multiply<hours::period, ratio<24>>> days; system_clock::time_point now = system_clock::now(); system_clock::duration tp = now.time_since_epoch(); days d = duration_cast<days>(tp); tp -= d; hours h = duration_cast<hours>(tp); tp -= h; minutes m = duration_cast<minutes>(tp); tp -= m; seconds s = duration_cast<seconds>(tp); tp -= s; // Remaining portion of a second with system_clock::duration precision std::cout << d.count() << "d " << h.count() << ':' << m.count() << ':' << s.count() << '\n';
Menggunakan Header-Only C Perpustakaan 11/14
Pustaka pengepala tarikh sahaja menawarkan penyelesaian yang lebih mudah, membolehkan anda mengekstrak komponen ini dengan mudah:
<code class="cpp">#include "date.h" #include <iostream> int main() { namespace C = std::chrono; namespace D = date; namespace S = std; auto tp = C::system_clock::now(); auto dp = D::floor<D::days>(tp); auto ymd = D::year_month_day{dp}; auto time = D::make_time(C::duration_cast<C::milliseconds>(tp - dp)); S::cout << "year = " << ymd.year() << '\n'; S::cout << "month = " << ymd.month() << '\n'; S::cout << "day = " << ymd.day() << '\n'; S::cout << "hour = " << time.hours().count() << "h\n"; S::cout << "minute = " << time.minutes().count() << "min\n"; S::cout << "second = " << time.seconds().count() << "s\n"; S::cout << "millisecond = " << time.subseconds().count() << "ms\n"; }</code>
C 20 Standard Ciri Perpustakaan (Akan Datang)
Dalam piawaian C 20 yang akan datang, pengekstrakan terus komponen temporal daripada system_clock::time_point disokong. Sintaksnya adalah seperti berikut:
<code class="cpp">auto tp = system_clock::now(); auto dp = floor<days>(tp); year_month_day ymd{dp}; hh_mm_ss time{floor<milliseconds>(tp - dp)}; auto y = ymd.year(); auto m = ymd.month(); auto d = ymd.day(); auto h = time.hours(); auto M = time.minutes(); auto s = time.seconds(); auto ms = time.subseconds();</code>
Atas ialah kandungan terperinci Bagaimanakah cara saya mengekstrak komponen temporal dari std::chrono::time_point?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!