簡體   English   中英

以毫秒為單位打印 time_t

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM