首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在现代C++中将双精度型转换为datetime

如何在现代C++中将双精度型转换为datetime
EN

Stack Overflow用户
提问于 2017-10-02 04:13:38
回答 1查看 2K关注 0票数 1

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

例如,Excel中显示的datetime:

21-08-2017 11:54

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

42968.4958333333

谢谢。

EDIT on 11/07/2019:这个问题是关于date.h库的使用。被指出为“可能的重复”的其他问题不需要使用这个库(另请参阅date.h库的作者下面的评论)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-02 06:53:46

使用date.h,它可能如下所示:

代码语言:javascript
运行
复制
#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';
}

以下哪项输出:

代码语言:javascript
运行
复制
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解释了off-by-one错误。Excel的编写者特意将1900年视为闰年,以向后兼容Lotus 1-2-3。

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

旁白:在这个范围内,IEEE64位double的精度比nanoseconds粗,但比microseconds好(大约是microsecond的一半)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46516471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档