我有以下字符串
2013-04-12 16:00:15.041
将此字符串转换为64位UNIX时间戳的C ++方法是什么?这里的大多数问题只涉及到时间戳,直到秒,但在我的情况下,我还需要包括毫秒。
答案 0 :(得分:0)
将字符串解析为其组件并构造std::chrono::time_point
。在C ++ 20中,<chrono>
中有utc_clock
,即utc_time
,或std::chrono::local_t
。在C ++ 11及更高版本中,您有std::chrono::system_clock
。
将故障时间转换为STL时间对象时会出现鸡与蛋的问题:通常情况下,只需使用C库就可以得到答案。如有必要,您可以在istringstream
上使用std::get_time()
将字符串转换为tm
和C标准库函数mktime()
,以将tm
转换为一个time_t
,您可以将其传递给std::chrono::system_clock::from_time_t()
以转换为std::chrono::time_point
- 除了在UNIX / Linux上,time_t
已经是UNIX时间戳!
您的示例没有指定时区,因此您可能需要也可能不需要进行时区转换。
utc_clock
使用1970年1月1日的same Epoch as POSIX,因此time_since_epoch()
/ utc_time
的{{1}}成员函数为您提供答案{ {1}}。如果您使用的是time_point
,Epoch是实现定义的(但几乎总是相同的Epoch),因此您需要在1970年1月1日凌晨00:00找到std::chrono::duration
,并从您计算的system_clock
中减去它以获得持续时间。您可以使用time_point
将此持续时间(称为time_point
)转换为秒。然后,如果您希望确保具有完全64位的值,则可以转换为moment
或std::chrono::seconds(moment).count()
(来自int64_t
)。
有一个few different UNIX time formats,但是如果你想把你的时间(毫秒)转换为纳秒的C / POSIX uint64_t
,而不是<cstdint>
中过时的格式,请设置{{} 1}}到毫秒乘以100万,或从timespec
转换为<sys/time.h>
。
如果这样做的目的是使用文件系统时间戳,您可能需要std::filesystem::file_time_type
。