如何在不使用std::tm和mktime()的情况下为给定的日历日期创建一个Chrono::time_point对象。

问题描述 投票:0回答:1

我想为一个给定的日期创建一个Chrono::time_point对象,例如:2020-03-06 22:48:01,格式是YYYY-MM-DD HH:MM:SS。我不想使用mktime(),因为它不安全。同时我也不想使用任何第三方库,如date。

c++ c++14
1个回答
1
投票

在C++11和C++14中,没有一个计时钟有指定的纪元。 然而其中有一个。 system_clock 在三个最流行的实现中, gcc, llvm 和 VS 有一个相同的纪元. 这个纪元是 1970-01-01 00:00:00 UTC, 不包括闰秒. 这也被称为 Unix时间.

虽然没有得到C++1114标准的保证,但你可以按照这个事实上的标准进行编程,以实现以下目标 std::chrono::system_clock. 但没有可移植的时代 steady_clockhigh_resolution_clock.

既然你不想牵扯到 std::tm你将不得不写你自己的代码来转换 YYYY-MM-DD HH:MM:SS 的秒数。Unix时间 纪元。 如果 YYYY-MM-DD HH:MM:SS 是当地时间,您还必须考虑到UTC偏移,以及UTC偏移本身可能是许多时区时间的函数(即夏令时)。 如果 YYYY-MM-DD HH:MM:SS 是字符串形式的,您还需要将这些字符解析为积分类型。

以下是一些有用的公式 用于转换 YYYY-MM-DD 的时间戳部分转化为自您的 Unix时间 epoch.

我的要求有一点变化,就是我可以使用std::tm,但不能使用mktime()。有没有办法创建std::chono::time_point对象?

如果你使用的是流中的数据,你可以使用 std::get_time<iomanip> 以获得数据到 tm. 还有一种非标准但很流行的 timegm() 兑换的 tmtime_t,忽略了时区(原始时间戳被解释为UTC)。 然后是一个 from_time_t 静态成员函数 system_clock 将转换 time_tsystem_clock::time_point.

嗯... 但是 timegm() 可能有资格作为一个第三方的lib...


0
投票

所有的时间点都是相对于产生它们的时钟的时代而言的。但是在C++14(和C++17)中,时钟的epochs是由实现指定的。每个实现的时钟都有一个时间点,但无法知道它们是什么。而且问也没有意义,因为时间最终都是相对于某个固定的日期而言的,所以纪元本身就必须相对于其他日期来表达。

所以你必须用 std::mktime 或第三方库。或者你可以自己写所有的代码,但是这些代码无法从任何特定的时钟中生成一个时间点,除非它是以特定的实现方式编码的。

© www.soinside.com 2019 - 2024. All rights reserved.