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);
Run Code Online (Sandbox Code Playgroud)
我希望上面的代码解析.123456为微秒。但是,运行时tTimePoint只包含日期和时间,不包括亚秒。
更长:
我在Windows 10上使用带有\cpplatest标志的Visual Studio 2019。我有一个简单的输入,用户可以在其中定义输入的日期时间格式。
字符串可以看起来像2020-09-16T22:00:00.123456或16.09.2020 22:00:00.123456或任何其他有效的日期时间格式,只要有一种方法可以使用std::chrono::from_stream的cppreference 中列出的限定符来描述它。
根据参考资料和我以前的经验std::format()(使用相同的格式),我假设它%S也解析亚秒。
我也试过,std::chrono::parse但这并没有说明%S会解析小数点后的亚秒。我尝试了各种不同的格式和日期时间格式,以确保此问题不会仅由于某些不规则的日期时间格式而发生。
这是cppreference文档中的错误,这是 Visual Studio 实现中未完全实现的功能,还是(很可能)我只是简单地遗漏了一些明显的内容?
感谢您为我提供的任何帮助!
假设我们有一个简单的函数,它接受一个 std::chrono::time_point 并使用给定的格式化字符串返回一个字符串。像这样:
std::string DateTimeToString(std::chrono::sys_time, const char * szFormat /*= "%Y/%m/%d %H:%M:%S"*/)
Run Code Online (Sandbox Code Playgroud)
根据std::formatter的 cppreference 文档,我们应该能够使用各个标签来创建像2021/03/24 15:36:32.123123. 但是,当 time_point 的持续时间使用微秒(我们必须使用)时,这将引发 format_error。
如果我们将其拆分为单独的调用,以便我们分别使用日期和时间的格式,那么它就可以工作。像这样:
auto tSysTime = std::chrono::system_clock::now();
std::string sTime = std::format("{:%H:%M:%S}", tSysTime.time_since_epoch());
std::string sDate = std::format("{:%Y/%m/%d}", std::chrono::sys_days(std::chrono::duration_cast<std::chrono::days>(tSysTime.time_since_epoch())));
Run Code Online (Sandbox Code Playgroud)
我是否误解了某些东西,或者没有办法为我的目的使用单一格式字符串?请记住,格式字符串是一个可选参数,因此我无法对单个参数的拆分进行硬编码。
我的期望是写
std::format("{:%Y/%m/%d %H:%M:%S}",tSysTime.time_since_epoch());
Run Code Online (Sandbox Code Playgroud)
然而,这崩溃了......
预先感谢您的任何帮助!
编辑:我在 Visual Studio 2019 中使用 /std::c++latest 标志