1970 年 c++ 之前的日期处理

Date handling before 1970 c++

本文关键字:日期 处理 c++ 1970      更新时间:2023-10-16

我想知道在这里做的最好的事情是什么。我得到了一个作业,我必须更新一个使用 Ctime 的 Date 类。

该类现在必须工作到 1970 年之前的日期。我环顾四周,没有找到太多...

所以我想我的问题是实现这一目标的最佳方法是什么?

日期范围从 [1970-2037] 到 [1900-2037]

假设你的意思是MFC CTime,如果你启用OLE你可以使用COleDateTime作为直接替代品。 根据文档,它支持"从 100 年 1 月 1 日到 9999 年 12 月 31 日"的日期。

您可以将日期存储为自 1970-01-01 或任何其他纪元以来的有符号整数天数。负日期是 1970 年之前的日期。

或者您可以使用Boost.Date_Time库。

一个日期类,它将内部std::tm日期时间对象和自 1970 年 1 月 1 日(或之前)以来(或之前)的总秒数存储为time_ttm的成员都是int的,time_t到处都应该是64位(我希望),所以理论上应该涵盖你可以考虑的所有时间。

在类的构造函数中,您需要计算这些总秒数,而似乎唯一可以做到这一点的标准库函数是 mktime 。不幸的是,这个仅适用于 1970 年 1 月 1 日之后的日期。

一种可能的解决方法...为这一年添加一个非常大的数字,并在内部使用它。

#include <ctime>
#include <iostream>
class CustomDateTime {
  const int MKTIME_DELTA = 100000;
  std::tm _datetime;
  std::time_t _total_seconds;
public:
  CustomDateTime(int year, int mon, int day, int hour, int min, int sec) {
    _datetime.tm_year = year - 1900 + MKTIME_DELTA;
    _datetime.tm_mon  = mon - 1;
    // copy day, hour, min, sec
    _total_seconds = std::mktime(&_datetime);
  }
  bool operator==(const CustomDateTime& rhs) { 
    return _total_seconds == rhs._total_seconds;
  }
  void print() {
    std::cout << _datetime.tm_year + 1900 - MKTIME_DELTA << ':'
      << _datetime.tm_mon + 1 << _datetime.tm_mday << 'n';
  }
};

这应该涵盖1970 - MKTIME_DELTA = -98030到遥远未来之间的所有年份。