Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah saya boleh mengekstrak unsur temporal individu seperti tahun, bulan, hari, jam, minit, saat dan milisaat daripada objek std::chrono::time_point?
Mengekstrak Elemen Temporal daripada std::chrono::time_point
Pertanyaan:
Bagaimanakah saya boleh mengekstrak unsur temporal tertentu, seperti tahun, bulan, hari, jam, minit, saat dan milisaat, daripada objek std::chrono::time_point?
Resolusi:
Untuk mengekstrak elemen ini daripada titik_masa, anda mesti menggunakan jam_sistem::titik_masa, kerana ia mempunyai hubungan dengan kalendar sivil. Dapatkan semula system_clock::time_point:
<code class="cpp">system_clock::time_point now = system_clock::now();</code>
Tukar ini kepada nilai time_t:
<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
Jika anda memerlukan pengekstrakan masa dalam zon waktu UTC atau zon waktu tempatan, tukar nilai time_t kepada tm:
<code class="cpp">tm utc_tm = *gmtime(&tt); // UTC tm local_tm = *localtime(&tt); // Local</code>
Ekstrak elemen tertentu menggunakan medan yang sepadan bagi struktur tm:
<code class="cpp">std::cout << local_tm.tm_year + 1900 << '\n'; // Year std::cout << local_tm.tm_mon + 1 << '\n'; // Month std::cout << local_tm.tm_mday << '\n'; // Day
Maklumat Dikembangkan:
Sementara menggunakan perpustakaan C membolehkan penukaran masa, adalah penting untuk ambil perhatian bahawa setiap pelaksanaan system_clock adalah berdasarkan masa Unix, biasanya diukur dalam saat sejak 1 Januari 1970 UTC.
Untuk pengekstrakan yang lebih tepat, manfaatkan ketepatan jam_sistem:
<code class="cpp">system_clock::duration tp = now.time_since_epoch(); days d = duration_cast<days>(tp); // Days tp -= d; // Subtract days hours h = duration_cast<hours>(tp); // Hours tp -= h; // Subtract hours ... // Continue for minutes, seconds, and fractional seconds</code>
Cetak hasil dengan unit tempoh yang sesuai:
<code class="cpp">std::cout << d.count() << "d " << h.count() << ':' << m.count() << ':' << s.count(); std::cout << " " << tp.count() << "[" << system_clock::duration::period::num << '/' << system_clock::duration::period::den << "]\n";
Penambahbaikan Perpustakaan:
Untuk pengekstrakan masa yang dipermudahkan, pertimbangkan untuk menggunakan pustaka C 11/14 seperti tarikh. Ini mengurangkan kod yang diperlukan kepada:
<code class="cpp">auto tp = std::chrono::system_clock::now(); using date::floor; // Namespace for streaming operator std::cout << tp << '\n'; // Outputs date and time components auto dp = floor<date::days>(tp); // Omits fractional parts auto ymd = date::year_month_day{dp}; ... // Individual elements can be accessed as members of ymd</code>
C 20 Standard Proposal:
Draf kerja C 20 yang dicadangkan termasuk sintaks langsung untuk mengekstrak medan ini daripada system_clock:: titik_masa:
<code class="cpp">year_month_day ymd{floor<days>(tp)}; hh_mm_ss time{floor<milliseconds>(tp - dp)}; auto y = ymd.year(); auto m = ymd.month(); ... // Extract remaining elements similarly</code>
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengekstrak unsur temporal individu seperti tahun, bulan, hari, jam, minit, saat dan milisaat daripada objek std::chrono::time_point?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!