Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah cara saya mengekstrak komponen temporal dari std::chrono::time_point?

Bagaimanakah cara saya mengekstrak komponen temporal dari std::chrono::time_point?

DDD
DDDasal
2024-10-30 23:39:29568semak imbas

How do I extract temporal components from a 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn