c++ “std::format“处理不带小数位的std::chrono秒

zwghvu4y  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(138)

在c++20中格式化秒(使用std::format)而不显示小数位的正确方法是什么?
此代码:

#include <chrono>
#include <format>
#include <iostream>

int main()
    {
        std::cout << std::format("{:%H:%M:%S}",  std::chrono::system_clock::now()) << std::endl;
        std::cout << std::format("{:%H:%M:%OS}", std::chrono::system_clock::now()) << std::endl;
    }

产生此输出(经由干线GCC(14.0.0 20230425)):

00:18:07.087240403
00:18:07.087622600

我只想要整数部分(例如00:18:07没有尾随.087240403)。事后从结果字符串中删除余数非常容易(或者手动提取秒数并单独打印),但如果这是预期的解决方案,我会非常惊讶。
此处描述了格式代码。AFAICT没有%S变量将秒显式舍入或截断为最接近的整数。
%S(和下面的%OS)的解释(来自上面的链接)是:
将秒写入十进制数。如果秒数小于10,则结果以0为前缀。
如果输入的精度不能精确地用秒表示,则格式为具有固定格式和与输入精度匹配的精度的十进制浮点数(或者,如果在18个小数位内无法转换为浮点十进制秒,则转换为微秒精度)。小数点字符根据区域设置进行本地化。
修改后的命令%OS写入区域设置的替代表示。
GCC/glibc在这里运行正常,对吗?(这似乎符合上面的解释)。
如果是这样的话,实现这一目标的“预期”方法是什么?
1.我是否使用不同的格式字符串?
1.我是否使用不同的时钟?
1.我是否首先手动舍入该值?(如果四舍五入,仍显示小数部分)。
1.或者我真的必须手动剥离小数部分或手动提取秒。
(* 如果 * 这不是 * 平凡 * 可实现的,这是否可以被认为是潜在的不良行为,也许是STL缺陷?)

cngwdvgl

cngwdvgl1#

您可以使用time_point_cast将其持续时间转换为seconds,然后对其进行格式化:

auto now = std::chrono::time_point_cast<std::chrono::seconds>(
             std::chrono::system_clock::now()
           );
std::cout << std::format("{:%H:%M:%S}", now) << std::endl;

相关问题