我想为一个给定的日期创建一个Chrono::time_point对象,例如:2020-03-06 22:48:01,格式是YYYY-MM-DD HH:MM:SS。我不想使用mktime(),因为它不安全。同时我也不想使用任何第三方库,如date。
在C++11和C++14中,没有一个计时钟有指定的纪元。 然而其中有一个。 system_clock
在三个最流行的实现中, gcc, llvm 和 VS 有一个相同的纪元. 这个纪元是 1970-01-01 00:00:00 UTC, 不包括闰秒. 这也被称为 Unix时间.
虽然没有得到C++1114标准的保证,但你可以按照这个事实上的标准进行编程,以实现以下目标 std::chrono::system_clock
. 但没有可移植的时代 steady_clock
或 high_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()
兑换的 tm
到 time_t
,忽略了时区(原始时间戳被解释为UTC)。 然后是一个 from_time_t
静态成员函数 system_clock
将转换 time_t
到 system_clock::time_point
.
嗯... 但是 timegm()
可能有资格作为一个第三方的lib...
所有的时间点都是相对于产生它们的时钟的时代而言的。但是在C++14(和C++17)中,时钟的epochs是由实现指定的。每个实现的时钟都有一个时间点,但无法知道它们是什么。而且问也没有意义,因为时间最终都是相对于某个固定的日期而言的,所以纪元本身就必须相对于其他日期来表达。
所以你必须用 std::mktime
或第三方库。或者你可以自己写所有的代码,但是这些代码无法从任何特定的时钟中生成一个时间点,除非它是以特定的实现方式编码的。