首页 > 解决方案 > 没有外部库的 C++ Int 到任何日期

问题描述

我需要将一些转换integersdate. 首先,我确实知道 Boost::Gregorian 库,但我不能使用它,因为它不能用 Clang 编译,这是我的应用程序获得最佳性能的地方。

我正在解析原始数据库文件,因此性能很重要,因为转换将发生数十万次以表示生日、时间戳、约会时间等。

根据我正在解析的数据库,我有几个不同的起源日期。我使用的原始日期是:

System 1: 1706-02-24
System 2: 1840-01-01

我以这种方式尝试过,但是timeinfo2当我尝试将其打印出来时,我得到了一个 null 错误:

time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
timeinfo->tm_year = 1706 - 1900;
timeinfo->tm_mon = 2 - 1;
timeinfo->tm_mday = 24;
timeinfo->tm_mday += 98040; // days since origin

time_t newtime;

struct tm* timeinfo2;
newtime = mktime(timeinfo);
timeinfo2 = localtime(&newtime);

结果应该是:1968-08-12

标签: c++dategregorian-calendar

解决方案


这是一个公共领域算法列表,这些算法模拟了 Unix 时间和预测的公历数百万年的时间向后和向前。 它们非常高效(无迭代、最少的分支、最少的缓存抖动)。

您可以使用这些算法编写自己的日期库,以正确处理 1970 年之前的日期。这些也是构成Howard Hinnant<chrono>的 C++20 预览版基础的相同算法。


推荐阅读