如何在现代C 中转换为DateTime

How to convert in modern C++ a double into a datetime

本文关键字:转换 DateTime      更新时间:2023-10-16

如何在现代C 中转换(C 11/14/17)将Excel工作表作为CSV文件导出时已生成?

例如,DateTime出现在Excel中:

21/08/2017 11:54

已被Excel转换为CSV文件,为double:

42968.4958333333

谢谢。

在2019年7月11日编辑:此问题是关于使用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到2017年8月21日11:54是正确的。我在另一个地方看到这个时代应该是1899-12-31,而不是1899-12-30。无论如何,一旦找到正确的时代,这就是一个人执行计算的方式。

ah,https://en.wikipedia.org/wiki/leap_year_bug解释了偏离的错误。Excel的作者故意将1900认为是leap年,目的是与Lotus 1-2-3的向后兼容。

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

旁边:在此范围内,IEEE 64位double的精度比nanoseconds更粗糙,但比microseconds更好(在microsecond的一半)。