gpt4 book ai didi

c++ - 如何在现代 C++ 中将 double 转换为日期时间

转载 作者:行者123 更新时间:2023-11-30 02:23:07 29 4
gpt4 key购买 nike

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

例如,Excel 中显示的日期时间:

2017年8月21日11:54

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

42968.4958333333

谢谢。

于 11/07/2019 编辑:这个问题是关于 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解释了差一错误。 Excel 的编写者故意将 1900 年视为闰年,以便向后兼容 Lotus 1-2-3。

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

旁白:在此范围内,IEEE 64 位double 的精度比纳秒 粗略,但比微秒 精细(按顺序排列) 微秒的一半)。

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com