将字符串时间转换为UNIX时间戳

9
我有一个字符串,像这样2013-05-29T21:19:48Z。我想将其转换为自1970年1月1日(UNIX纪元)以来的秒数,以便我可以只使用4个字节(或者可能5个字节,以避免2038年问题)进行保存。如何以便携方式实现?(我的代码必须在Linux和Windows上运行。)
我可以从字符串中获取日期部分,但我不知道如何确定秒数。我尝试查看C ++中日期和时间实用程序的documentation,但没有找到任何内容。

2
你试过什么吗? - Rapptz
@Rapptz 请看更新。我尝试查看文档,但没有找到任何内容。 - svick
C++没有像其他语言(如C#)那样好的日期/时间工具。你最好的选择可能是在Boost库中找到适用于你情况的东西。 - Rapptz
无论您使用的是Windows还是Linux,提到两者解决方案(包括boost)的答案可以在https://dev59.com/1HRC5IYBdhLWcg3wXPsC找到。 - Tony Delroy
4个回答

7
这里是可运行的代码。
string s{"2019-08-22T10:55:23.000Z"};
std::tm t{};
std::istringstream ss(s);

ss >> std::get_time(&t, "%Y-%m-%dT%H:%M:%S");
if (ss.fail()) {
    throw std::runtime_error{"failed to parse time string"};
}   
std::time_t time_stamp = mktime(&t);

4

如果你想使用C++的方式,可以使用std::get_time - 但其他两个选项也是有效的。strptime将忽略末尾的Z,而T可以通过格式字符串%Y-%m-%dT%H:%M:%s来适应 - 但你也可以直接在末尾加上Z。


2
但是那并不能返回UNIX时间戳。 - svick
1
请考虑让您的答案更加全面,例如解释std::locale、facets以及mktime是否涉及时区等内容。 - mxmlnkn

1

特别是如果您不能使用C++11(在那里可以使用Iwan Aucamp的解决方案) - Andre Holzner

0

您可以使用boost date_time或更具体的ptime

使用ptime time_from_string(std::string)来初始化您的时间,使用long total_seconds()来获取持续时间的秒数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接