2

当在将 Excel 工作表导出为 CSV 文件时生成双精度时,如何使用date.h库将现代 C++(C++11/14/17)中的精度转换为日期时间?

例如,出现在 Excel 中的日期时间:

21/08/2017 11:54

已由 Excel 转换为 CSV 文件作为双精度:

42968.4958333333

谢谢。

编辑于 2019 年 7 月 11 日:这个问题是关于date.h库的使用。指出为“可能重复”的其他问题不需要使用此库(另请参阅date.h库作者的以下评论)

4

1 回答 1

5

使用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解释了一个错误。Excel 的作者故意将 1900 年视为闰年,以便与 Lotus 1-2-3 向后兼容。

此输出是在 macOS 上生成的,system_clock::duration其中microseconds. system_clock::duration在具有其他单位的其他平台上,输出会略有不同。

旁白:在这个范围内,IEEE 64 位的精度比(大约一半)更doublenanoseconds但更细。microsecondsmicrosecond

于 2017-10-01T22:53:45.940 回答