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

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

21/08/2017 11:54

已被Excel转换为CSV文件的 double 格式:

42968.4958333333

谢谢。

,2019年11月7日编辑:该问题与date.h库的使用有关。指出为“可能重复”的其他问题不需要使用此库(另请参见date.h库作者在下面的评论)

最佳答案

使用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解释了by-by-one错误。 Excel的作者特意认为1900年是leap年,目的是向后兼容Lotus 1-2-3。

此输出在system_clock::durationmicroseconds的macOS上生成。在system_clock::duration具有其他单位的其他平台上,输出将略有不同。

另外:在此范围内,IEEE 64位double的精度比nanoseconds粗,但比microseconds更好(约为microsecond的一半)。

关于c++ - 如何在现代C++中将double转换为日期时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46516471/

10-11 22:23
查看更多