Datetime 霍华德·希南特';s date::parse()函数是否可以使用浮点持续时间?

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

我正试图使用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;
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})};