为了便于移植,当我使用{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打印?
2条答案
按热度按时间zed5wv101#
std::chrono::system_clock
表示UTC时间。当使用
"{:%F %T}"
打印fmt::format()
时钟时,输出与区域设置无关。但是,当使用operator<<
打印时钟时,这相当于使用{:L%F %T}
和ostream
当前指定的区域设置打印std::format()
时钟。ajsxfq5m2#
它与
fmt
库不一致。根据标准,
std::chrono::system_clock::time_point
是Unix时间中的一个点,它与UTC时间非常相似,但没有闰秒。如果使用%Z
,格式化程序应该在输出中插入字符串"UTC"
。该标准为其他时钟指定了格式化器,如
utc_clock
和tai_clock
,但fmt
(似乎没有实现这些)。为了获得最大的便携性,use
std::gmtime
。