你如何从霍华德·欣南特约会中获得秒数
How do your get fractional seconds from Howard Hinnant date
示例:从字符串中解析日期/时间,然后我想分解日期/时间的组成部分。似乎我得到了一切,但我被困在小数秒。代码如下
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;
错误 C2039:"微秒":不是"日期::time_of_day"的成员
啊,刚刚得到编辑。
正确,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;
};
如果我更改:
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
(以及返回类型(变化太大,以至于我无法给出更精确的名称来返回秒的小数部分。 如上所述,可以nanoseconds
。 或者它甚至可能是像microfortnights
这样疯狂的事情.
在下面的评论中,当我注意到这个问题发现了一个错误时。 事实证明,当我尝试解析microfortnights
时,我遇到了一个编译时错误,我刚刚修复了该错误。
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 为什么兰德每次都给我几乎相同(但略有不同)的数字
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- C++结构到德尔福记录dll调用
- 瓦尔格林德的内存泄漏使用新的
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 如何使用兰德随机化模拟点击
- 在C++上实现高斯赛德尔迭代方法
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 赫尔格林德和atomic_flag
- 如何在德尔福中C++制作与此类似的结构
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- 删除堆后对瓦尔格林德错误感到困惑
- 德尔福在回调中出现 GUI 问题
- 使用霍华德·欣南特的日期库将时间信息添加到year_month_day
- 你如何从霍华德·欣南特约会中获得秒数
- 使用霍华德·欣南特的日期库将双倍转换为zoned_time
- 从霍华德·欣南特的日期库中提取日期和时间
- 霍华德·辛南特short_alloc的快速移动任务