Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mengekstrak komponen temporal daripada objek `std::chrono::time_point`?

Bagaimanakah saya boleh mengekstrak komponen temporal daripada objek `std::chrono::time_point`?

Susan Sarandon
Susan Sarandonasal
2024-11-02 18:58:31438semak imbas

How can I extract temporal components from a `std::chrono::time_point` object?

Mengekstrak Komponen Temporal daripada std::chrono::time_point

Objektif: Memperoleh tahun, bulan, hari, jam, minit, saat , dan milisaat daripada objek std::chrono::time_point.

Penyelesaian:

Untuk mengekstrak maklumat ini, anda secara khusus memerlukan system_clock::time_point, menyediakan hubungan dengan sistem kalendar sivil.

<code class="cpp">using namespace std::chrono;
system_clock::time_point now = system_clock::now();</code>

Langkah seterusnya ialah menukarnya kepada time_t menggunakan:

<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>

Gunakan perpustakaan C untuk menukar time_t kepada tm, memastikan masa yang sesuai zon dipilih:

<code class="cpp">tm utc_tm = *gmtime(&amp;tt);
tm local_tm = *localtime(&amp;tt);</code>

Kini, anda boleh mengekstrak 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';

Mengekstrak Komponen Jam Sistem

Selain itu, jika anda mahu, anda boleh bergantung pada pendekatan tidak terjamin berikut:

Setiap pelaksanaan system_clock yang paling diketahui adalah berdasarkan masa Unix (bilangan saat sejak 1 Januari 1970 UTC), biasanya dengan ketepatan yang lebih halus daripada saat.

Atur cara komprehensif berikut menyediakan contoh mengekstrak semua komponen temporal:

<code class="cpp">#include <chrono>
#include <ctime>
#include <iostream>

int main() {
  using namespace std::chrono;
  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;
  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";

  time_t tt = system_clock::to_time_t(now);
  tm utc_tm = *gmtime(&amp;tt);
  tm local_tm = *localtime(&amp;tt);
  std::cout << utc_tm.tm_year + 1900 <&lt '-';
  std::cout << utc_tm.tm_mon + 1 << '-';
  std::cout << utc_tm.tm_mday << ' ';
  std::cout << utc_tm.tm_hour << ':';
  std::cout << utc_tm.tm_min << ':';
  std::cout << utc_tm.tm_sec << '\n';
}</code>

Menggunakan Tempoh Tersuai

Untuk memodelkan hari, buat tempoh tersuai:

<code class="cpp">typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;</code>

Kini anda boleh mendapatkan masa sejak zaman dengan ketepatan system_clock::duration:

<code class="cpp">system_clock::duration tp = now.time_since_epoch();</code>

Potong kepada hari dan tolak:

<code class="cpp">days d = duration_cast<days>(tp);
tp -= d;</code>

Ulang ini proses selama jam, minit dan saat.

Bakinya ialah pecahan sesaat dalam unit system_clock::duration.

Menggunakan Pustaka Tarikh

C ini Pustaka 11/14 menyelaraskan proses di atas:

<code class="cpp">#include "date.h"
#include <iostream>

int main() {
  using C = std::chrono;
  using D = date;
  using S = std;

  auto tp = C::system_clock::now();
  {
    using namespace date;
    S::cout << tp << '\n';
  }
  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";
}

C 20 Standard Library Support

C 20 memperkenalkan sintaks standard untuk mengekstrak medan ini daripada 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>

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengekstrak komponen temporal daripada objek `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