首頁 > 後端開發 > C++ > 主體

如何從 C 中的「std::chrono::time_point」物件中提取特定的日期和時間元件,例如年、月、日、小時、分鐘、秒和毫秒?

Barbara Streisand
發布: 2024-10-30 07:59:27
原創
821 人瀏覽過

How do you extract specific date and time components, like year, month, day, hours, minutes, seconds, and milliseconds, from a `std::chrono::time_point` object in C  ?

從std::chrono::time_point 中提取日期和時間組件

問題:

我們如何檢索特定的來自std::chrono::time_point 物件的日期和時間元件,例如年、月、日、小時、分鐘、秒和毫秒?

解決方案:

要提取此信息,我們必須利用 system_clock::time_point,因為它是系統提供的唯一與民用日曆連接的時鐘。

<code class="cpp">system_clock::time_point now = system_clock::now();</code>
登入後複製

轉換為時間戳:

接下來,將time_point 轉換為time_t:

<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
登入後複製

提取組件:

使用C 庫,將time_t 到tm,指定是否要以UTC 或本地時區進行轉換:

<code class="cpp">tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);</code>
登入後複製

現在,您可以列印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';
登入後複製

擴展提取:

雖然system_clock 通常基於Unix 時間,但其精確度通常大於秒。若要存取高解析度元件,請使用以下程式碼:

<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";
}
登入後複製

透過將time_point 轉換為天、小時、分鐘、秒,並提取秒的小數部分,此程式碼輸出:

15806d 20:31:14 598155[1/1000000]
登入後複製

庫解決方案:

僅標頭日期庫簡化了此過程,允許使用以下程式碼進行提取:

<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";
}
登入後複製

C 20 整合:

在C 20 中,包含建議的語法,用於使用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>
登入後複製

此外,您可以指定首選時間提取區。

以上是如何從 C 中的「std::chrono::time_point」物件中提取特定的日期和時間元件,例如年、月、日、小時、分鐘、秒和毫秒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板