如何将带有毫秒的日期时间字符串转换为UNIX时间戳

时间:2018-04-07 22:59:59

标签: c++ unix-timestamp

我有以下字符串

2013-04-12 16:00:15.041

将此字符串转换为64位UNIX时间戳的C ++方法是什么?这里的大多数问题只涉及到时间戳,直到秒,但在我的情况下,我还需要包括毫秒。

1 个答案:

答案 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位的值,则可以转换为momentstd::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