Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-02 18:58:31
asal
512 orang telah melayarinya

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>
Salin selepas log masuk

Langkah seterusnya ialah menukarnya kepada time_t menggunakan:

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

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>
Salin selepas log masuk

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';
Salin selepas log masuk

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>
Salin selepas log masuk

Menggunakan Tempoh Tersuai

Untuk memodelkan hari, buat tempoh tersuai:

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

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

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

Potong kepada hari dan tolak:

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

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";
}
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan