如何从年、月、日、时、分、秒、毫秒获取计时时间点?

问题描述

我正在编写一个设备驱动程序,它只在每个单独的字段(年、月、日、小时、分钟、秒、毫秒)中发送时间。我需要将其转换为计时时间点,并最终转换为自纪元以来的纳秒整数计数。如何从年、月、日、时、分、秒、毫秒获取计时时间点?

使用c++17;

解决方法

您可以创建一个填充 std::tm 的小转换函数,使用 std::time_t 创建一个 std::mktime,然后调用所选时钟的 from_time_t 函数(注意,并非所有时钟有这个功能),最后加上毫秒。

#include <ctime>
#include <iostream>
#include <chrono>

template<class Clock = std::chrono::system_clock>
class Clock::time_point foo(int year,int month,int day,int hour,int minute,int second,int millisecond)
{
    std::tm t{};
    t.tm_year = year - 1900;
    t.tm_mon = month - 1;
    t.tm_mday = day;
    t.tm_hour = hour;
    t.tm_min = minute;
    t.tm_sec = second;
    return Clock::from_time_t(std::mktime(&t)) + std::chrono::milliseconds(millisecond);
}

int main() {
    auto tp = foo(2021,3,8,22,25,50,469);
    std::chrono::nanoseconds tse = tp.time_since_epoch();
    std::cout << tse.count() << '\n';                     // 1615242350469000000
}

请注意,这会根据计算机的本地时区设置将输入解释为本地日期/时间。