如何在现代 C++ 中将双精度型转换为日期时间
How to convert in modern C++ a double into a datetime
如何在现代 C++ (C++11/14/17) 中使用 date.h 库将 double 转换为日期时间,当 double 具有在将 Excel 工作表导出为 CSV 文件时生成?
例如,Excel中出现的日期时间:
21/08/2017 11:54
已被 Excel 转换为 CSV 文件,作为双:
42968.4958333333
谢谢。
编辑于 2019 年 7 月 11 日: 这个问题是关于 date.h 库的使用。 "possible duplicates" 指出的其他问题不需要使用此库(另请参阅 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 解释了差一错误。 Excel 的作者故意将 1900 年视为闰年,以便与 Lotus 1-2-3 向后兼容。
此输出是在 system_clock::duration
为 microseconds
的 macOS 上生成的。在 system_clock::duration
具有其他单位的其他平台上,输出会略有不同。
旁白:在此范围内,IEEE 64 位 double
的精度比 nanoseconds
更粗,但比 microseconds
更精细(约为 [=18= 的一半) ]).
如何在现代 C++ (C++11/14/17) 中使用 date.h 库将 double 转换为日期时间,当 double 具有在将 Excel 工作表导出为 CSV 文件时生成?
例如,Excel中出现的日期时间:
21/08/2017 11:54
已被 Excel 转换为 CSV 文件,作为双:
42968.4958333333
谢谢。
编辑于 2019 年 7 月 11 日: 这个问题是关于 date.h 库的使用。 "possible duplicates" 指出的其他问题不需要使用此库(另请参阅 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 解释了差一错误。 Excel 的作者故意将 1900 年视为闰年,以便与 Lotus 1-2-3 向后兼容。
此输出是在 system_clock::duration
为 microseconds
的 macOS 上生成的。在 system_clock::duration
具有其他单位的其他平台上,输出会略有不同。
旁白:在此范围内,IEEE 64 位 double
的精度比 nanoseconds
更粗,但比 microseconds
更精细(约为 [=18= 的一半) ]).