c++ 带有本地时间日期的fmt::format()与带有iostream的不同

s5a0g9ez  于 2023-03-20  发布在  iOS
关注(0)|答案(2)|浏览(207)

为了便于移植,当我使用{fmt}库来格式化日期和时间时,我遇到了一个打印时间的小问题,可能fmt将时间作为本地时间,而<iostream>将时间打印为UTC?
最小示例:

#include <chrono>
#include <fmt/chrono.h>

int main(){ 
    using TimePoint = std::chrono::system_clock::time_point;

    TimePoint localTime = std::chrono::system_clock::now();

    auto localTimeStr = fmt::format("{:%F %T}", localTime);

    std::cout << localTimeStr << std::endl
              << localTime;

     return 0;
}

输出:

2023-03-15 21:47:46
2023-03-15 20:47:46.0631142

我使用的是MSVC 19.34,fmt 9.1.0
在这种情况下,如何设置fmt以正确格式化时间?
我看了文档,但没有找到任何解决方案。我希望为<iostream>fmt字符串打印相同的值。如何使用fmt lib格式化时间,使其始终以UTC打印?

zed5wv10

zed5wv101#

std::chrono::system_clock表示UTC时间。
当使用"{:%F %T}"打印fmt::format()时钟时,输出与区域设置无关。但是,当使用operator<<打印时钟时,这相当于使用{:L%F %T}ostream当前指定的区域设置打印std::format()时钟。

ajsxfq5m

ajsxfq5m2#

它与fmt库不一致。
根据标准,std::chrono::system_clock::time_point是Unix时间中的一个点,它与UTC时间非常相似,但没有闰秒。如果使用%Z,格式化程序应该在输出中插入字符串"UTC"
该标准为其他时钟指定了格式化器,如utc_clocktai_clock,但fmt(似乎没有实现这些)。
为了获得最大的便携性,use std::gmtime

相关问题