[英]Printing time_t in milliseconds
我有一堆以微秒為單位的任務,下面的代碼只打印到幾秒(2021 年 10 月 21 日星期四 12:48:20),所以比較開始和結束的值總是最終給出 0。我想成為能夠以毫秒和微秒的順序進行比較。 有沒有一個功能可以幫助解決這個問題?
另外,有沒有辦法轉換uint64_t current1 = std::chrono::system_clock::now().time_since_epoch().count();
到time_t
根據count()
打印出當前時間?
const auto p1 = std::chrono::system_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(p1);
std::cout << "now: " << std::ctime(&now);
time_t
通常是指定(整)秒的整數。
您可以通過從now
減去整秒time_t
來獲得毫秒:
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
p1 - std::chrono::system_clock::from_time_t(now)).count();
或使用operator%
:
auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>p1)
.time_since_epoch() % std::chrono::seconds(1);
std::cout << ms.count();
示例如何進行格式化:
#include <chrono>
#include <iostream>
#include <iomanip>
int main() {
using Clock = std::chrono::system_clock;
using Precision = std::chrono::milliseconds;
auto time_point = Clock::now();
// extract std::time_t from time_point
std::time_t t = Clock::to_time_t(time_point);
// output the part supported by std::tm
std::cout << std::put_time(std::localtime(&t), "%FT%T."); // select format here
// get duration since epoch
auto dur = time_point.time_since_epoch();
// extract the sub second part from the duration since epoch
auto ss =
std::chrono::duration_cast<Precision>(dur) % std::chrono::seconds{1};
// output the millisecond part
std::cout << std::setfill('0') << std::setw(3) << ss.count();
}
我建議完全跳過 C 計時 API。 它容易出錯並且不能處理亞秒級精度。
如果 UTC(而不是本地時間)沒問題,那么C++20有一個僅標頭的開源預覽版,可與 C++11/14/17 一起使用:
#include "date/date.h"
#include <chrono>
#include <iostream>
int
main()
{
using date::operator<<;
const auto p1 = std::chrono::system_clock::now();
std::cout << "now: " << p1 << '\n';
}
輸出:
now: 2021-10-21 20:28:15.754423
要將上述程序移植到 C++20(已在最新的 Visual Studio 中提供),只需刪除#include "date/date.h"
並using date::operator<<;
.
如果您需要本地時間,也可以在 C++20 中使用(在 VS 中提供),但C++20 的開源預覽不再只是標題。 存在一個需要編譯的源文件,根據您的需要,可能需要下載 IANA tz 數據庫。
#include "date/tz.h"
#include <chrono>
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
const auto p1 = system_clock::now();
std::cout << "now: " << zoned_time{current_zone(), p1} << '\n';
}
輸出:
now: 2021-10-21 16:28:15.754423 EDT
上述語法假設 C++17。 對於C ++ 11/14模板參數zoned_time
需要指定: zoned_time<system_clock::duration>
。
上述程序通過刪除#include "date/tz.h"
並using namespace date;
#include "date/tz.h"
到 C++20 using namespace date;
.
在任一程序中,您都可以使用以下命令截斷到毫秒精度:
const auto p1 = floor<milliseconds>(system_clock::now());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.