4

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

不幸的是,它不能处理纪元之前的日期,因为它的方法依赖于 gmtime() 和 mktime() 进行许多操作,而我们的 Windows 系统不支持纪元之前的日期。有谁知道在 Windows 上支持负值的 gmtime 和 mktime 的替换。

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

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

4

3 回答 3

3

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

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

如果您必须考虑您的值在世界上多个不同位置有效,请使用UTC 时间作为您的规范形式,并根据需要转换为本地时间以进行合理的输入/显示。

于 2013-03-11T18:36:55.000 回答
0

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

于 2018-06-08T15:29:02.717 回答
0

即将推出您附近的std::lib 实现

#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]

可在此处预览。

于 2018-06-08T18:09:04.557 回答