提升中的日期(仅年份)之间的差异

时间:2013-03-19 19:00:08

标签: c++ boost

我想知道是否有任何简单和简短方法来计算C ++中使用boost的两个日期之间经过了多少年?

e.g。 (YYYY-MM-DD):

2005-01-01至2006-01-01为1年

2005-01-02至2006-01-01为0年

如果我假设使用这样的代码没有闰年,我可以很容易地计算出来:

boost::gregorian::date d1( 2005, 1, 1 );
boost::gregorian::date d2( 2006, 1, 1 );

boost::gregorian::date_duration d3 = d1 - d2;
std::cout << abs( d3.days() ) / 365;

但是使用这样的代码,2000-01-02和2001-01-01之间的差异是1年,当它应该是0,因为2000年是闰年,我想考虑闰年。

//编辑

我希望将年份作为整数。我已经创建了这样的代码(现在我觉得它正在运行),但是如果有人比我更了解提升,我会很感激一些优雅的解决方案:

boost::gregorian::date d1( 2005, 4, 1 );
boost::gregorian::date d2( 2007, 3, 1 );

int _yearsCount = abs( d1.year() - d2.year() );

// I want to have d1 date earlier than d2
if( d2 < d1 ) {
    boost::gregorian::date temp( d1 );
    d1 = boost::gregorian::date( d2 );
    d2 = temp;
}

// I assume now the d1 and d2 has the same year
// (the later one), 2007-04-01 and 2007-03-1
boost::gregorian::date d1_temp( d2.year(), d1.month(), d1.day() );
if( d2 < d1_temp )
    --_yearsCount;

1 个答案:

答案 0 :(得分:3)

假设您想要全年(0,1或更多)的数量,那么:

if (d1 > d2)
    std::swap(d1, d2); // guarantee that d2 >= d1

boost::date_time::partial_date pd1(d1.day(), d1.month());
boost::date_time::partial_date pd2(d2.day(), d2.month());

int fullYearsInBetween = d2.year() - d1.year();
if (pd1 > pd2)
    fullYearsInBetween -= 1;

虽然这基本上等于你的算法(你在写这篇文章时编辑了帖子)。