gpt4 book ai didi

c++ - 将 ISO8601 字符串转换为自纪元以来的毫秒数

转载 作者:行者123 更新时间:2023-11-30 02:17:41 27 4
gpt4 key购买 nike

示例字符串:

2018-10-31T14:45:21.778952-07:00

我想将它转换为 int64_t 代表自纪元以来的毫秒(甚至微秒)。时区可能会有所不同。代码将在 linux 机器上执行,但我只能访问 std 和 folly(不能使用任何任意 3P 库)。

我搜索了这个并发现了一些对我不起作用的不同方法:

  1. strptime() 和 std::get_time() 失去了毫秒精度
  2. 更重要的是,它们都不能处理时区偏移
  3. 其他一些解决方案依赖于 3P 库

有什么简单的方法可以做到这一点吗?

最佳答案

来自上面的评论:

I am looking into using Howard's library. However, that it makes a web call gives me pause. I assume that if the call fails it will just use the locally stored timezone name data? We won't be dealing with timezone names, so I don't care about those. However, making a network call might be an issue.

Howard's library分层:

  1. A foundational layer不需要 IANA 时区数据库,因此永远不会进行网络调用。这是一个单一的头文件,只有头文件的库。

  2. A time zone layer了解 IANA 时区数据库。该层可以配置为是否进行网络调用(取决于构建标志),甚至可以使用操作系统的时区数据库(Windows 除外)。

您的应用程序不需要 time zone layer因为它只处理 UTC 偏移量,而不处理时区名称或规则。

这是一个转换 std::string 的函数将您的示例格式转换为 std::chrono::time_point<std::chrono::system_clock, std::chrono::microseconds> .对于 system_clock::time_point 来说,这种类型太冗长了。除了保证有 microseconds精确。 foundational layer这种类型有一个类型别名 date::sys_time<std::chrono::microseconds> .

#include "date/date.h"
#include <chrono>
#include <iostream>
#include <sstream>

auto
to_sys_time(std::string s)
{
using namespace date;
using namespace std;
using namespace std::chrono;
istringstream in{move(s)};
in.exceptions(ios::failbit);
sys_time<microseconds> tp;
in >> parse("%FT%T%z", tp);
return tp;
}
  • string进入istringstream .
  • 可选择设置 istringstream在无法解析某些内容时抛出异常(您可以选择以不同方式处理错误)。
  • 声明您的 time_point具有所需的精度。
  • 用你想要的格式解析它。
  • 归还它。

你可以像这样练习这个函数:

int
main()
{
auto tp = to_sys_time("2018-10-31T14:45:21.778952-07:00");
using date::operator<<;
std::cout << tp << " UTC\n";
std::cout << tp.time_since_epoch() << '\n';
}
  • 调用to_sys_time使用所需的输入字符串。
  • namespace date 中制作流媒体运营商可用。
  • 打印出 time_point (这是一个 UTC time_point )。
  • 提取并打印出 durationtime_point .

这个程序的输出是:

2018-10-31 21:45:21.778952 UTC
1541022321778952µs

此程序将通过删除 #include "date/date.h" 移植到 C++20 , using namespace date;using date::operator<<; .

关于c++ - 将 ISO8601 字符串转换为自纪元以来的毫秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53289574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com