std::chrono::from_stream能否以微秒的精度将字符串转换为时间点



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时,它只包含不包括子条件的日期和时间。

更长:

我在Windows 10上使用带有\cpplatest标志的Visual Studio 2019。我有一个简单的输入,用户可以定义输入的日期时间格式。

字符串可以看起来像2020-09-16T22:00:00.12345616.09.2020 22:00:00.123456或任何其他有效的日期时间格式,只要有一种方法可以使用std::chrono::from_stream的cppreference中列出的限定符来描述它。

根据参考文献和我以前使用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

最新更新