如何比较日期和时间,以字符串格式给出?

Posted

技术标签:

【中文标题】如何比较日期和时间,以字符串格式给出?【英文标题】:How to compare date and time, given in string format? 【发布时间】:2021-05-02 06:18:27 【问题描述】:

我想知道如何在 C++ 中以字符串格式比较日期和时间? 换句话说,我的问题是如何使用库为以下类实现比较功能?

class DateTime 
  private: 
   string date =;
   string time ;
  public :
     DateTime (string d, string t) :date (d), time(t) 
     
     DateTime diff (DateTime t1, DateTime t2) 
     //?
     
;

假设我这样称呼它

DateTime from ("2020-11-09", "06:22:30");
DateTime to ("2021-04-03", "23:54:13");
Date diff = to.diff (from ,to);

这只是一个例子,任何比较日期和时间的建议都值得赞赏。我的限制是日期和时间以字符串格式给出,如果我能以秒或上面显示的类似字符串格式返回它们的差异,那就太好了。

我在 VScode 中尝试过这个struct,但我得到编译错误,它无法识别time_t 变量成员。

【问题讨论】:

请显示您尝试的代码的minimal reproducible example 以及您收到的确切错误消息 如果您想查看 <ctime><chrono> 库,它们都不支持将自定义文本格式转换为时间/日期对象。您需要自己创建它们。 (我敢肯定,那里有很好的图书馆你可以寻找) 随着进一步挖掘,您似乎可以使用chrono::from_streamchrono::parse 为您的chrono::duration 类型和C++20 自定义解析器。但是,我手头没有它来测试它。 【参考方案1】:

这是我在搜索不同的参考资料后如何完成它。 首先,在使用大约 8000 个输入进行测试时,我得到了一些随机错误的结果,但我意识到我在代码中注释的一个字段应该在调用 mktime() 函数之前更新。

class Time 
   private:
      time_t _timeType;
      struct tm buf;
      struct tm * _timeinfo  = &buf;
      string _timeStr;
      string _dateStr;

 public:
      Time (string time, string date) : _timeStr(time),_dateStr(date)  // YYYY-MM-DD , HH:MM:SS
           int hr =  stoi(time.substr(0,2));
           int min = stoi(time.substr(3,2));
           int sec = stoi(time.substr(6,2));

           int yr = stoi(date.substr(0,4));
           int mon = stoi(date.substr(5,2));
           int day = stoi(date.substr(8,2));  

            _timeinfo->tm_hour = hr;
            _timeinfo->tm_min = min;
            _timeinfo->tm_sec = sec;
            _timeinfo->tm_mday = day;
            _timeinfo->tm_mon = mon-1; // because it is in range of [0:11]
            _timeinfo->tm_year = yr;
           /*I updated this field to prevent strange reports based folloing this recommendation
           https://***.com/questions/26788470/difftime-returns-strange-value-on-particular-date
           */ 
            _timeinfo->tm_isdst = -1;
            _timeType = mktime(_timeinfo);   
      

      void compareTime (Time* t)   
         cout<<_timeStr<<" "<< _dateStr<<" "<<t->_timeStr <<" "<<t->_dateStr<<" "<<difftime(_timeType, t->_timeType)<<endl;
      
;

【讨论】:

以上是关于如何比较日期和时间,以字符串格式给出?的主要内容,如果未能解决你的问题,请参考以下文章

在 where 子句中将字符串更改为日期时间格式以进行比较

如何获取日期格式以大写月份和日期

如何使用月份和年份格式以精确格式显示日期[重复]

字符串的日期时间分别添加时间和日期

以 hh:mm:ss 格式表示的两个日期之间的碳时间差

java日期格式转换的问题