從std::chrono::time_point 中提取時間元素
查詢:
如何從std::chrono::time_point 物件中提取特定的時間元素,例如年、月、日、小時、分鐘、秒和毫秒?
解決方案:
要從 time_point 中提取這些元素,您必須使用 system_clock::time_point,因為它與民用日曆有關係。檢索目前的system_clock::time_point:
<code class="cpp">system_clock::time_point now = system_clock::now();</code>
將其轉換為time_t 值:
<code class="cpp">time_t tt = system_clock::to_time_t(now);</code>
如果您需要UTC 時區或本地時區的時間提取,請轉換time_t 值到tm:
<code class="cpp">tm utc_tm = *gmtime(&tt); // UTC tm local_tm = *localtime(&tt); // Local</code>
使用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
擴展資訊:
而使用C 庫允許時間轉換,需要注意的是,每個system_clock 實作都是基於Unix 時間,通常以UTC 時間1970 年1 月1 日以來的秒為單位。
要更精確地提取,請利用system_clock precision:
<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>
使用適當的持續時間單位列印結果:
<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";
庫增強:
為了簡化時間提取,考慮使用C 11/14 庫,例如date。這將必要的代碼減少為:
<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 標準提案:
提議的C 20 工作草案包括用於從system_clock 提取這些字段的直接文法:時間點:
<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>
以上是如何從 std::chrono::time_point 物件中提取單一時間元素,例如年、月、日、小時、分鐘、秒和毫秒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!