代表纪元之前的日期

时间:2013-03-11 18:31:05

标签: c++ c windows datetime epoch

我们有一个定制的日期时间C ++类,它表示自纪元以来经过的秒数的时间。它存储为int64。该类提供了许多辅助函数来读写各种类型的日期时间格式。

不幸的是它无法处理epoch之前的日期,因为它的方法依赖于gmtime()和mktime()进行许多操作,这在我们的Windows系统上不支持epoch之前的日期。有没有人知道更换支持Windows上负值的gmtime和mktime。

这种限制的一个例子是我们的应用程序无法在1970年之前存储生日,因为每个日期都必须使用此类。

我不清楚我在问什么,这是因为我对日期时间实施/使用的了解有限以及我不愿意理解这个巨大的遗产类,所以如果你觉得这个问题可以用另一种方式构建或者我可能会寻找不同的东西随意建议。

3 个答案:

答案 0 :(得分:3)

您可以使用Boost.DateTime,或直接使用Win32 APIs而不是CRT。

您可能需要进行大量测试,以确保在返工时数据处理不会发生变化。确保在开始任何重构之前对库进行详尽的单元测试。

如果您必须考虑您的价值在世界各地的多个不同地点有效,请使用UTC time作为规范表单,并根据需要转换为当地时间以进行合理输入/显示。

答案 1 :(得分:0)

也许你自几年前就已经解决了这个问题,但你也可以使用ICU。例如:http://userguide.icu-project.org/datetime/calendar/examples

答案 2 :(得分:0)

即将到达您附近的std::lib implementation

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    std::cout << "Valid range is ["
              << sys_days{year::min()/January/1} + 0us << ", "
              << sys_days{year::max()/December/31} + 23h + 59min + 59s + 999'999us
              << "]\n";
}

输出:

Valid range is [-32767-01-01 00:00:00.000000, 32767-12-31 23:59:59.999999]

Preview available here.