在 C++ 中比较结构中日期的最佳方法是什么 它有日、月和年变量,即如何检查事件发生后 30 天已经过去等等。我个人发现,在比较同一年的 2 个日期时,我使用一个数组将两个日期都设为“days-dates”,该数组保存一年中所有月份的天数,然后将日期转换为天数并进行我需要的计算.有没有更简单的方法来比较日期?
最佳答案
这是一个很好的C++11/14 library for handling dates 1。它可以让你拥有 {year, month, day}
结构(称为 date::year_month_day
)和 {count-of-days}
结构(称为 sys_days
)。它还允许在这两种结构之间进行简单高效的转换。自然还有比较运算符。
整个库本质上是 <chrono>
的扩展进入日历类型。
视频介绍在这里:
https://www.youtube.com/watch?v=tzyGjOm8AKo
这里详细解释了 {year, month, day}
之间转换的底层算法。结构和 {count-of-days}
结构:
http://howardhinnant.github.io/date_algorithms.html
以下是字段 (year_month_day
) 和序列 (sys_days
) 数据结构的一些日期创建和比较示例:
#include "date.h"
int
main()
{
using namespace date::literals;
// create and compare {year, month, day} structures
constexpr auto ymd1 = 2017_y/jan/21;
constexpr auto ymd2 = ymd1 + date::months{15};
static_assert(ymd2 > ymd1, "ymd2 is 15 months after ymd1");
static_assert(ymd2 == 2018_y/apr/21, "ymd2 is 2018-04-21");
// create and compare {count_of_days} structures
constexpr date::sys_days sd2 = ymd2;
static_assert(sd2 == ymd2, "sd2 is the same day as ymd2");
static_assert(sd2.time_since_epoch().count() == 17642, "sd2 is day 17642");
constexpr date::sys_days sd1 = sd2 - date::days{465};
static_assert(sd1 < sd2, "sd1 is 465 days before sd2");
static_assert(sd1.time_since_epoch().count() == 17177, "sd1 is day 17177");
static_assert(sd1 == 2017_y/jan/11, "sd1 is 2017-01-11");
}
constexpr
/static_assert
需要完全符合 C++14 的编译器。对于 C++11,删除 constexpr
并更改 static_assert
至 assert
(并删除 static_assert
消息)。
date::sys_days
是 chrono::time_point
的类型定义:
time_point<system_clock, duration<int, ratio<86400>>
上面的示例代码只需要"date.h"
,并且没有其他 C++ 源文件(无需安装)。还有一个 timezone library at this same github location ,但这确实需要一些安装。
1 我是这个库的主要作者。
关于c++ - 在 C++ 中比较日期的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41767430/