Datetime 霍华德·希南特';s date::parse()函数是否可以使用浮点持续时间?
我正试图使用Howard Hinnant的库将Datetime 霍华德·希南特';s date::parse()函数是否可以使用浮点持续时间?,datetime,c++11,chrono,Datetime,C++11,Chrono,我正试图使用Howard Hinnant的库将2020-03-25T08:27:12.828Z解析为std::chrono::time\u point 预计以下代码将输出两个相同的字符串: #include "date.h" #include <chrono> #include <string> #include <iostream> using namespace std; using namespace std::chrono; us
2020-03-25T08:27:12.828Z
解析为std::chrono::time\u point
预计以下代码将输出两个相同的字符串:
#include "date.h"
#include <chrono>
#include <string>
#include <iostream>
using namespace std;
using namespace std::chrono;
using namespace date;
int main() {
double d = 1585124832.828;
time_point<system_clock, duration<double>> t{duration<double>{d}}, t1;
string s {format("%FT%TZ", t) };
cout << s << "\n";
stringstream ss {s};
ss >> parse("%FT%TZ", t1);
cout << format("%FT%TZ", t1) << "\n";
}
当我声明t
和t1
如下:
time_point<system_clock, milliseconds> t{duration_cast<milliseconds>(duration<double>{d})}, t1;
时间点t{duration\u cast(duration{d}}),t1;
代码按预期工作,即它输出两行相同的代码。它可以解析浮点,但您确实不想这样做。建议使用毫秒进行修复
说明:
设置双精度秒的格式时,它使用默认为小数点后6位的fixed
格式。这就是为什么在.828
后面会看到3个尾随的零
在解析时,预期精度由输入类型的精度驱动,即使rep
是浮点。因此,使用duration
时,它只解析秒的整数部分。然后它开始寻找尾随的Z
,并找到
。这会导致解析失败。如果解析字符串中没有Z
,它不会失败,但也不会解析秒的小数部分
如果将时间点
更改为双基微秒
,则它会再次工作:
time_point<system_clock, duration<double, micro>> t{duration<double>{d}}, t1;
从基于浮点的转换为基于整数的rep
s时,我喜欢使用round
而不是duration\u cast
。当基本的double
不能准确表示所需的值并且duration\u cast
在错误的方向截断时(接近零),这可以避免一个一个的错误<代码>舍入
将舍入最接近的可表示值
可以使用模板化类型别名date::sys\u time
进一步简化上述内容:
sys_time<milliseconds> t{round<milliseconds>(duration<double>{d})}, t1;
sys_time t{round(duration{d}}),t1;
上述情况完全相同sys\u time
是time\u point
的类型别名。在C++20中,它通过新的CTAD规则进一步简化:
sys_time t{round<milliseconds>(duration<double>{d})};
sys_time t{round(duration{d});
是从参数类型(C++20)推导出来的。尽管随后必须单独声明t1
,或给出t1
一个毫秒
初始值(例如,t1{0ms};
)
sys_time<milliseconds> t{round<milliseconds>(duration<double>{d})}, t1;
sys_time t{round<milliseconds>(duration<double>{d})};