你如何从 Howard Hinnant 日期中得到小数秒
How do your get fractional seconds from Howard Hinnant date
示例:从字符串解析日期/时间然后我想分解 date/time 的组成部分。似乎我得到了所有但我被困在小数秒上。代码如下
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;
//以下是错误的
std::cout << "Micro Seconds: " << the_time.microseconds().count() << std::endl;
error C2039: 'microseconds': 不是 'date::time_of_day'
的成员
啊,刚刚得到编辑。
正确,microseconds
不是 date::time_of_day
的成员。当 Duration
具有亚秒精度时,time_of_day<Duration>
的 documentation 给出了这个概要:
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;
};
如果我改变:
the_time.microseconds().count()
至:
the_time.subseconds().count()
那么我得到的输出是:
2016-12-11 15:43:22.099992
Year: 2016
Month: 12
Date: 11
Hour: 15
Minutes: 43
Seconds: 22
Micro Seconds: 99992
这是你得到的吗?如果是,您将得到正确的答案。如果您不明白,请告诉我们您 看到了什么。错误时有发生,我感谢错误报告并尝试尽快修复它们。
如果是您所看到的,并且您不相信它是正确的,您可能会对四舍五入感到困惑。您正在阅读 7 位十进制小数,然后要求将其四舍五入为 6 位小数。如果您希望字符串中时间戳的完全精度,您将需要使用至少与 100ns 一样精细的单位,例如:
date::sys_time<std::chrono::nanoseconds> tp;
// ...
auto the_time = date::make_time(tp - dp);
// ...
std::cout << "Nanoseconds: " << the_time.subseconds().count() << std::endl;
现在输出以:
结尾
Nanoseconds: 99991900
更新
与更明显的名称 microseconds
相对的名称 subseconds
的基本原理是该成员的 precision
(因此 return 类型)是我无法为 return 小数秒起一个更准确的名称。如上所示,它可能是 nanoseconds
。或者它甚至可以是像 microfortnights
.
这样疯狂的东西
在下面的评论中,当我注意到这个问题发现了一个错误。事实证明,当我尝试解析 microfortnights
时出现编译时错误,我刚刚修复了该错误。
示例:从字符串解析日期/时间然后我想分解 date/time 的组成部分。似乎我得到了所有但我被困在小数秒上。代码如下
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;
//以下是错误的
std::cout << "Micro Seconds: " << the_time.microseconds().count() << std::endl;
error C2039: 'microseconds': 不是 'date::time_of_day'
的成员啊,刚刚得到编辑。
正确,microseconds
不是 date::time_of_day
的成员。当 Duration
具有亚秒精度时,time_of_day<Duration>
的 documentation 给出了这个概要:
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;
};
如果我改变:
the_time.microseconds().count()
至:
the_time.subseconds().count()
那么我得到的输出是:
2016-12-11 15:43:22.099992
Year: 2016
Month: 12
Date: 11
Hour: 15
Minutes: 43
Seconds: 22
Micro Seconds: 99992
这是你得到的吗?如果是,您将得到正确的答案。如果您不明白,请告诉我们您 看到了什么。错误时有发生,我感谢错误报告并尝试尽快修复它们。
如果是您所看到的,并且您不相信它是正确的,您可能会对四舍五入感到困惑。您正在阅读 7 位十进制小数,然后要求将其四舍五入为 6 位小数。如果您希望字符串中时间戳的完全精度,您将需要使用至少与 100ns 一样精细的单位,例如:
date::sys_time<std::chrono::nanoseconds> tp;
// ...
auto the_time = date::make_time(tp - dp);
// ...
std::cout << "Nanoseconds: " << the_time.subseconds().count() << std::endl;
现在输出以:
结尾Nanoseconds: 99991900
更新
与更明显的名称 microseconds
相对的名称 subseconds
的基本原理是该成员的 precision
(因此 return 类型)是我无法为 return 小数秒起一个更准确的名称。如上所示,它可能是 nanoseconds
。或者它甚至可以是像 microfortnights
.
在下面的评论中,当我注意到这个问题发现了一个错误。事实证明,当我尝试解析 microfortnights
时出现编译时错误,我刚刚修复了该错误。