std::chrono::from_stream 能否以微秒精度将字符串转换为 time_point?
Can std::chrono::from_stream convert string to time_point with microseconds accuracy?
TLDR:
std::chrono::sys_time<std::chrono::microseconds> tTimePoint;
std::istringstream stream("2020-09-16 22:00:00.123456");
std::chrono::from_stream(stream, "%Y-%m-%d %H:%M:%S", tTimePoint);
我希望上面的代码将 .123456
解析为微秒。然而,当 运行 这个 tTimePoint
只包含不包括亚秒的日期和时间。
更长:
我正在使用 Visual Studio 2019 并在 Windows 上使用 \cpplatest 标志10。
我有一个简单的输入,用户可以在其中为输入定义他们的日期时间格式。
字符串可以看起来像 2020-09-16T22:00:00.123456
或 16.09.2020 22:00:00.123456
或任何其他有效的日期时间格式,只要有使用 cppreference for std::chrono::from_stream.[=22 中列出的限定符描述它的方法即可=]
根据参考资料和我之前使用 std::format()
(使用相同格式)的经验,我假设 %S
也解析亚秒级。
我也试过 std::chrono::parse
但这并没有说明 %S
会解析小数点后的亚秒。我已经尝试了各种不同的格式和日期时间格式,以确保这个问题不会仅仅因为一些不规则的日期时间格式而发生。
这是 cppreference 文档中的错误吗,这是 Visual Studio 实现中未完全实现的功能,还是(很可能)我只是遗漏了一些东西这很明显吗?
感谢您提供的任何帮助!
据我所知,VS2019 在使用 from_stream
和应该使用亚秒级的 time_point
时存在缺陷。在 VS2019 库中有一个地方应该处理它 - 但它从未进入那种情况。
幸运的是,如果您使用 duration
而不是 time_point
,它就可以工作,所以您 可以 解决这个问题:
#include <chrono>
#include <sstream>
#include <iostream>
int main() {
std::istringstream stream("2020-09-16 22:00:00.123456");
std::chrono::sys_time<std::chrono::microseconds> tTimePoint;
// extract all but the second:
std::chrono::from_stream(stream, "%Y-%m-%d %H:%M:", tTimePoint);
std::chrono::microseconds micros;
// extract the second:
std::chrono::from_stream(stream, "%S", micros);
// add the duration to the time_point
tTimePoint += micros;
std::cout << tTimePoint << '\n';
}
Bugreport - 当前状态:已修复:Visual Studio 2022 版本 17.0 预览版 3
TLDR:
std::chrono::sys_time<std::chrono::microseconds> tTimePoint;
std::istringstream stream("2020-09-16 22:00:00.123456");
std::chrono::from_stream(stream, "%Y-%m-%d %H:%M:%S", tTimePoint);
我希望上面的代码将 .123456
解析为微秒。然而,当 运行 这个 tTimePoint
只包含不包括亚秒的日期和时间。
更长:
我正在使用 Visual Studio 2019 并在 Windows 上使用 \cpplatest 标志10。 我有一个简单的输入,用户可以在其中为输入定义他们的日期时间格式。
字符串可以看起来像 2020-09-16T22:00:00.123456
或 16.09.2020 22:00:00.123456
或任何其他有效的日期时间格式,只要有使用 cppreference for std::chrono::from_stream.[=22 中列出的限定符描述它的方法即可=]
根据参考资料和我之前使用 std::format()
(使用相同格式)的经验,我假设 %S
也解析亚秒级。
我也试过 std::chrono::parse
但这并没有说明 %S
会解析小数点后的亚秒。我已经尝试了各种不同的格式和日期时间格式,以确保这个问题不会仅仅因为一些不规则的日期时间格式而发生。
这是 cppreference 文档中的错误吗,这是 Visual Studio 实现中未完全实现的功能,还是(很可能)我只是遗漏了一些东西这很明显吗?
感谢您提供的任何帮助!
据我所知,VS2019 在使用 from_stream
和应该使用亚秒级的 time_point
时存在缺陷。在 VS2019 库中有一个地方应该处理它 - 但它从未进入那种情况。
幸运的是,如果您使用 duration
而不是 time_point
,它就可以工作,所以您 可以 解决这个问题:
#include <chrono>
#include <sstream>
#include <iostream>
int main() {
std::istringstream stream("2020-09-16 22:00:00.123456");
std::chrono::sys_time<std::chrono::microseconds> tTimePoint;
// extract all but the second:
std::chrono::from_stream(stream, "%Y-%m-%d %H:%M:", tTimePoint);
std::chrono::microseconds micros;
// extract the second:
std::chrono::from_stream(stream, "%S", micros);
// add the duration to the time_point
tTimePoint += micros;
std::cout << tTimePoint << '\n';
}
Bugreport - 当前状态:已修复:Visual Studio 2022 版本 17.0 预览版 3