如何获取 Howard Hinnant 日期的小数秒数

Rwe*_*ale 5 c++ date std

示例:从字符串中解析日期/时间,然后我想分解日期/时间的组成部分。似乎我得到了所有内容,但我陷入了小数秒的困境。代码如下

std::wistringstream in{ L"2016-12-11 15:43:22.0999919" };
date::sys_time<std::chrono::microseconds> tp;
in >> date::parse(L"%F %T", tp);
assert(!in.fail());
assert(!in.bad());

date::sys_days dp = date::floor<date::days>(tp);
date::year_month_day the_date = date::year_month_day{ dp };
date::time_of_day<std::chrono::microseconds> the_time = date::make_time(tp - dp);
std::cout << the_date << ' ' << the_time << std::endl;

std::cout << "Year: " << the_date.year() << std::endl;
std::cout << "Month: " << (unsigned)the_date.month() << std::endl;
std::cout << "Date: " << the_date.day() << std::endl;

std::cout << "Hour: " << the_time.hours().count() << std::endl;
std::cout << "Minutes: " << the_time.minutes().count() << std::endl;
std::cout << "Seconds: " << the_time.seconds().count() << std::endl;
Run Code Online (Sandbox Code Playgroud)

// 以下说法不正确

std::cout << "Micro Seconds: " << the_time.microseconds().count() << std::endl;
Run Code Online (Sandbox Code Playgroud)

错误 C2039:“微秒”:不是“日期::time_of_day”的成员

How*_*ant 1

啊,刚刚编辑完。

正确,microseconds不是 的成员date::time_of_day。当具有亚秒精度时,文档给出了time_of_day<Duration>这个概要:Duration

time_of_day<std::chrono::duration<Rep, Period>>
{
public:
    using precision = The decimal-based duration used to format

    constexpr time_of_day() noexcept;
    constexpr explicit time_of_day(std::chrono::duration<Rep, Period> since_midnight) noexcept;

    constexpr std::chrono::hours   hours() const noexcept;
    constexpr std::chrono::minutes minutes() const noexcept;
    constexpr std::chrono::seconds seconds() const noexcept;
    constexpr precision subseconds() const noexcept;
    constexpr unsigned mode() const noexcept;

    constexpr explicit operator precision() const noexcept;
    constexpr precision to_duration() const noexcept;

    void make24() noexcept;
    void make12() noexcept;
};
Run Code Online (Sandbox Code Playgroud)

如果我改变:

the_time.microseconds().count()
Run Code Online (Sandbox Code Playgroud)

到:

the_time.subseconds().count()
Run Code Online (Sandbox Code Playgroud)

然后我得到的输出是:

2016-12-11 15:43:22.099992
Year: 2016
Month: 12
Date: 11
Hour: 15
Minutes: 43
Seconds: 22
Micro Seconds: 99992
Run Code Online (Sandbox Code Playgroud)

这就是你得到的吗?如果是,那么您将得到正确的答案。如果您没有收到此消息,请告诉我们您看到的内容。错误时有发生,我很欣赏错误报告并尝试尽快修复它们。

如果这就是您所看到的,并且您不相信它是正确的,那么您可能会对舍入感到困惑。您正在读取 7 位十进制小数位,然后要求将其四舍五入为 6 位十进制小数位。如果您希望字符串中的时间戳具有完整精度,则需要使用至少 100 纳秒的单位,例如:

date::sys_time<std::chrono::nanoseconds> tp;
// ...
auto the_time = date::make_time(tp - dp);
// ...
std::cout << "Nanoseconds: " << the_time.subseconds().count() << std::endl;
Run Code Online (Sandbox Code Playgroud)

现在输出以:

Nanoseconds: 99991900
Run Code Online (Sandbox Code Playgroud)

更新

subseconds该名称与更明显的名称相反的基本原理microseconds是,precision该成员的(以及返回类型)变化太大,我无法给出更精确的名称来返回小数秒。可以nanoseconds如上面所演示的那样。或者它甚至可能是一些疯狂的事情,比如microfortnights

在下面的评论中,当我注意到这个问题时发现了一个错误。事实证明,当我尝试解析时microfortnights出现编译时错误,我刚刚修复了该错误。