为什么在HowardHinnant的date.h库中没有to_stream和from_stream格式的毫秒标记

Sim*_*eUk 3 c++ time date c++-chrono

我正在使用HowardHinnant date.h格式化文件名,该文件名必须包含精度为HH-MM-SS-ms的毫秒级时间

10-23-44-564

目前,我必须将time_point转换为毫秒精度,并使用%S标志,例如

 "%H-%M-%S"
Run Code Online (Sandbox Code Playgroud)

小数点“。” 然后必须将其更改为连字符。

这一切似乎都比较笨拙,使我相信我对此考虑得过多。

有人可以让我挺直吗?

How*_*ant 5

没有一个很好的方法可以做到这一点。但是,可以创建一个facet提供-作为小数点字符的字符,并在format调用中使用该字符,如下所示:

#include "date/date.h"
#include <iostream>
#include <locale>

class punct_facet: public std::numpunct<char>
{
protected:
    char do_decimal_point() const override { return '-'; }
};

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;

    cout << format(locale{locale{}, new punct_facet},
                   "%H-%M-%S", 15h + 34min + 9s + 123ms) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出:

15-34-09-123
Run Code Online (Sandbox Code Playgroud)

这是另一种工作方式:

#include "date/date.h"
#include <iostream>
#include <iomanip>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;

    auto d = 15h + 34min + 9s + 23ms;
    auto s = floor<seconds>(d);
    cout << format("%H-%M-%S-", s) << setfill('0') << setw(3) << (d-s).count() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出:

15-34-09-023
Run Code Online (Sandbox Code Playgroud)