【问题标题】:Representing dates before epoch表示纪元之前的日期
【发布时间】:2013-02-27 01:28:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你需要走多远。追溯到 1900 年以后可能会开始变得非常棘手。
  • 我们不想超过 1900,如果这样可以通过更少的代码更改解决问题。

标签: c++ c windows datetime epoch


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      即将来到您附近的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.

      【讨论】:

        猜你喜欢
        • 2015-10-20
        • 2019-04-20
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多