c++ - 使用 boost::chrono,如何从不同的年、月、日、小时、分钟、秒计算自纪元 UTC 以来的毫秒数

标签 c++ boost c++-chrono

我得到了 UTC 年、月、日、小时、分钟和秒的值。我需要计算自纪元 (UTC) 以来的毫秒数。

如何实现?

谢谢

最佳答案

如果你可以忽略leap seconds ,使用正确的工具这很容易。

你需要:

  1. days_from_civil位于here .
  2. 自定义duration代表天数 == 24 小时的类型(如下所示)。
  3. C++11 的 std::chronoboost::chrono库(我用 std::chrono 展示它)。

以下是创建自定义 chrono::duration 的方法代表 24 小时:

typedef std::chrono::duration
<
    std::int32_t, std::ratio_multiply<std::chrono::hours::period, std::ratio<24>>
> days;

现在您可以编写函数了:

std::chrono::milliseconds
ms_since_UTC(int year, int month, int day, std::chrono::hours h,
             std::chrono::minutes m, std::chrono::seconds s)
{
    return days(days_from_civil(year, month, day)) + h + m + s;
}

days_from_civil将转换您的 year/month/day进入自 1970 年新年(UTC 纪元)以来的天数。您的定制duration days将与“预定义”计时持续时间无缝互操作:hours , minutes , seconds , 和 milliseconds .所有这些持续时间都将隐式转换为 milliseconds没有截断错误。

如果需要取leap seconds考虑在内,那么您将需要构建一个 {days, chrono::seconds} 的表,如果当前值为 days,则条目的第二部分是您需要添加到持续时间的闰秒累计数在 days 或之后表中的条目。

static constexpr std::pair<days, std::chrono::seconds> leap_seconds[25] =
{
    std::make_pair(days(days_from_civil(1972, 7, 1)), std::chrono::seconds(1)),
    // ...
};

然后您需要搜索该表(使用 std::find_ifstd::lower_bound )以查看是否从 days_from_civil 返回位于 table 前、 table 内或 table 外。如果在表格之前添加 0 闰秒。如果在表内,则根据表条目添加适当的闰秒数。如果超出表格,则添加(当前)25 闰秒。

return d + h + m + s + ls;

这是一个“高维护”解决方案,因为每次他们决定向 UTC 添加闰秒时,都需要更新此代码中的表格。还应该注意的是,这个解决方案不能在未来超过 6 个月的时间内高度自信地使用,因为人们根本不知道 future 是否会增加(或减少)闰秒。

days_from_civil代码在公共(public)领域,所以请随意使用它。这是有效的。当给定 32 位带符号输入时,它的 +/- 范围约为 580 万年(因此您实际上不必担心超出其有效性范围)。 The paper如果您有兴趣,可以深入了解该算法的工作原理。

关于c++ - 使用 boost::chrono,如何从不同的年、月、日、小时、分钟、秒计算自纪元 UTC 以来的毫秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20130895/

相关文章:

c++ - boost::mpl 不使用(甚至不兼容)std::pair 的原因是什么?

c++ - 如何将 compressed_sparse_row_graph 和 dijkstra 与 BOOST 图形库一起使用

c++ - 使用 chrono::high_resolution_clock::now() 的奇怪行为

c++ - 如何将消息时间戳写入日志文件?

c++ - 类型未声明错误

c++ - 虚函数设计问题

c++ - ScopeGuard 解雇

c++ - AfxPumpMessage() 用于什么?

boost 库路径包括

c++ - 将 time_point 降低到给定持续时间的推荐方法