发布于 2017-10-02 06:53:46
使用date.h,它可能如下所示:
#include "date/date.h"
#include <iostream>
std::chrono::system_clock::time_point
to_chrono_time_point(double d)
{
using namespace std::chrono;
using namespace date;
using ddays = duration<double, days::period>;
return sys_days{December/30/1899} + round<system_clock::duration>(ddays{d});
}
int
main()
{
using date::operator<<;
std::cout << to_chrono_time_point(42968.495833333333333333333) << '\n';
}
以下哪项输出:
2017-08-21 11:54:00.000000
此定义假设您从42968.4958333333到21/08/2017 11:54的映射是正确的。我在另一个地方看到,纪元应该是1899-12-31,而不是1899-12-30。在任何情况下,一旦找到正确的时期,这就是执行计算的方式。
啊,https://en.wikipedia.org/wiki/Leap_year_bug解释了off-by-one错误。Excel的编写者特意将1900年视为闰年,以向后兼容Lotus 1-2-3。
此输出是在system_clock::duration
为microseconds
的macOS上生成的。在system_clock::duration
具有其他单元的其他平台上,输出将略有不同。
旁白:在这个范围内,IEEE64位double
的精度比nanoseconds
粗,但比microseconds
好(大约是microsecond
的一半)。
https://stackoverflow.com/questions/46516471
复制相似问题