繁体   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