我有开始日期和结束日期。我需要找到这些日期之间的差异,并将其分为以下类别。
< 1年,< 2年,直到X年。
我正试图为这个问题编写一个unix C ++程序。 我可以很容易地找到开始和结束日期之间的unix时间差,并与1年的时间戳(12 * 30 * 20 * 60 * 60)进行比较等等。
是否有任何C ++函数返回给定开始日期和结束日期的年份差异?另外,让我们说,差异是8年,我想我必须写这样的条件,
if((end_date - start_date) < 12 * 30 * 24 * 60 * 60)
group = " less than 1 year"
...
...
直到我停下来,因为我不知道日期之间的最大差异是什么?
有没有简单的方法来计算它?
我知道我在这里感到困惑,但我已尽全力解释这里的问题。提前致谢。 另请注意,这不是作业或任何内容。
答案 0 :(得分:0)
#include <chrono>
using years = std::chrono::duration<std::chrono::system_clock::rep, std::ratio<365 * 24 * 60 * 60, 1>>;
std::chrono::system_clock::time_point end_date = std::chrono::system_clock::now();
std::chrono::system_clock::time_point start_date = end_date - years(2);
years how_many = std::chrono::duration_cast<years>(end_date - start_date);
int how_many_as_int = how_many.count();
std::cout << how_many_as_int << std::endl;
std::unordered_map<int, std::list<whatever>> m;
m[how_many_as_int].push_back(...);
答案 1 :(得分:0)
假设“精确年限”(换句话说,所有年份都是365天)不是问题,我会做这样的事情(计算每年在这种情况下发生的次数 - 因为原始问题没有'真的说每年做什么)
const int MAX_YEARS = 10;
const int YEAR_IN_SECONDS = 365 * 24 * 60 * 60;
std::array<int, MAX_YEARS+1> bins;
int years = static_cast<int>(difftime(end_date - start_date) / YEAR_IN_SECONDS);
// Outside of range, put it at the end of range...
// We could discard or do something else in this case.
if (years > MAX_YEARS)
{
years = MAX_YEARS;
}
bins[years]++; // Seen one more of "this year".
显然,你使用“bins”做什么,以及你在那里存储数据的方式和方式实际上取决于你实际想要实现的目标。
另一种解决方案是使用const double YEAR_IN_SECONDS = 365.25 * 24 * 60 * 60;
,这将略微更好地覆盖闰年。如果你想要准确地说明它,你必须要知道你是否在特定年份的每个平面之前或之后可以被4整除(并且请记住,有几年可以被100整除的特殊情况和400)的其他规则。