C ++ 20 chrono,解析为分区时间并格式化而没有尾随小数

C++20 chrono, parsing into zoned time and formatting without trailing decimals

我正在编写一些代码,从用户那里获取一个字符串,并将其格式化为分区时间。解析代码比这个例子复杂一点,但是这样会重现问题。

这是用 MSVC++ 编译的,用 /std:c++latest 编译。

#include <iostream>
#include <string>
#include <chrono>
#include <sstream>

int main() {
    std::string timeString("2020-02-03 00:12:34");
    std::string formatString("%Y-%m-%d %T");

    bool successful = true;
    std::stringstream iss(timeString);
    std::chrono::local_time<std::chrono::system_clock::duration> localTimeStamp;
    if (not (iss >> std::chrono::parse(formatString, localTimeStamp))) {
        successful = false;
    }
    auto result = std::chrono::zoned_time(std::chrono::current_zone(), localTimeStamp);

    std::cout << std::format("{:%Y-%m-%d %T}", result) << std::endl;
}

结果如下:

2020-02-03 00:12:34.0000000

我希望输出没有尾随小数。因为它是一个字符串,所以我总是可以截断小数点处的字符串。有更好的方法吗?

只需将 localTimeStamp 的类型更改为 seconds 精度:

std::chrono::local_time<std::chrono::seconds> localTimeStamp;

如果您愿意,还有这个方便的类型别名可以做同样的事情:

std::chrono::local_seconds localTimeStamp;

解析和格式化的精度取决于所使用的 time_point 的精度。