Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah anda mengekstrak komponen tarikh dan masa tertentu, seperti tahun, bulan, hari, jam, minit, saat dan milisaat, daripada objek `std::chrono::time_point` dalam C ?
Masalah:
Bagaimana kita boleh mendapatkan semula tertentu komponen tarikh dan masa, seperti tahun, bulan, hari, jam, minit, saat dan milisaat, daripada objek std::chrono::time_point?
Penyelesaian:
Untuk mengekstrak maklumat ini, kita mesti menggunakan system_clock::time_point kerana ia adalah satu-satunya jam yang dibekalkan sistem yang mempunyai sambungan kepada kalendar sivil.
<code class="cpp">system_clock::time_point now = system_clock::now();</code>
Menukar kepada Cap Masa :
Seterusnya, tukarkan titik_masa kepada masa_t:
<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
Mengekstrak Komponen:
Menggunakan perpustakaan C, tukar time_t kepada tm, menyatakan sama ada anda mahu penukaran dalam UTC atau zon waktu tempatan:
<code class="cpp">tm utc_tm = *gmtime(&tt); tm local_tm = *localtime(&tt);</code>
Kini, anda boleh mencetak komponen tm:
<code class="cpp">std::cout << local_tm.tm_year + 1900 << '\n'; std::cout << local_tm.tm_mon + 1 << '\n'; std::cout << local_tm.tm_mday << '\n';
Pengekstrakan Lanjutan:
Walaupun system_clock biasanya berdasarkan masa Unix, ketepatannya selalunya lebih besar daripada saat. Untuk mengakses komponen resolusi tinggi, gunakan kod berikut:
<code class="cpp">using namespace std; using namespace std::chrono; int main() { typedef duration<int, ratio_multiply<hours::period, ratio<24> >>::type 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; cout << d.count() << "d " << h.count() << ':' << m.count() << ':' << s.count(); cout << " " << tp.count() << "[" << system_clock::duration::period::num << '/' << system_clock::duration::period::den << "]\n"; }
Dengan menukar titik_masa kepada hari, jam, minit, saat dan mengekstrak pecahan saat, kod ini mengeluarkan:
15806d 20:31:14 598155[1/1000000]
Penyelesaian Perpustakaan:
Pustaka tarikh pengepala sahaja memudahkan proses ini, membenarkan pengekstrakan dengan kod berikut:
<code class="cpp">#include "date.h" int main() { auto tp = std::chrono::system_clock::now(); auto dp = date::floor<date::days>(tp); auto ymd = date::year_month_day{dp}; auto time = date::make_time(std::chrono::duration_cast<std::chrono::milliseconds>(tp - dp)); std::cout << "year = " << ymd.year() << '\n'; std::cout << "month = " << ymd.month() << '\n'; std::cout << "day = " << ymd.day() << '\n'; std::cout << "hour = " << time.hours().count() << "h\n"; std::cout << "minute = " << time.minutes().count() << "min\n"; std::cout << "second = " << time.seconds().count() << "s\n"; std::cout << "millisecond = " << time.subseconds().count() << "ms\n"; }
Penyepaduan C 20:
Dalam C 20, sintaks yang dicadangkan disertakan untuk mengekstrak medan ini menggunakan system_clock::time_point:
<code class="cpp">#include <chrono> int main() { using namespace std::chrono; 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>
Selain itu, anda boleh menentukan masa pilihan zon untuk pengekstrakan.
Atas ialah kandungan terperinci Bagaimanakah anda mengekstrak komponen tarikh dan masa tertentu, seperti tahun, bulan, hari, jam, minit, saat dan milisaat, daripada objek `std::chrono::time_point` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!