【问题标题】:number of months between two dates - using boost's date两个日期之间的月数 - 使用 boost 的日期
【发布时间】:2010-04-26 15:29:11
【问题描述】:

我现在稍微使用了 boost::gregorian::date。

我可以看到有相关的月、年和周持续时间类型。 我可以看到如何使用已知的持续时间来提前给定日期。

:但是我怎样才能得到两个日期之间的月(或年或周)的差异呢?

我希望找到这样的功能:

template<typename DURATION>
  DURATION date_diff<DURATION>(const date& d1,const date& d2);

也需要对舍入进行一些处理。

此函数将返回 d1 和 d2 之间的(例如)整月数。

【问题讨论】:

    标签: c++ boost date


    【解决方案1】:

    您是指日期之间的差异 (09/12 - 08/05 = 01/07 = 19months) 还是时间差异 ((date2_seconds - date1_seconds) / seconds_per_month)?

    对于第一种情况,可以使用访问器

    greg_year date::year() const;
    greg_month date::month() const;
    

    然后是月份日期之间的差异:

    int months = (data2.year() - date1.year())*12 + date2.month() - date1.month()
    

    对于第二种情况,你有运营商

    date_duration date::operator-(date) const;
    

    并且 date_duration 有以下有用的成员:

    long date_duration::days() const;
    

    所以你可以这样做:

    //date date1, date2
    int months = (date2-date1).days()/30;
    

    【讨论】:

    • 是的,如果不清楚,抱歉。我的意思是两个日期之间的月数。 (以某种方式向上或向下舍入。)我会澄清这个问题。顺便说一句,最后一行代码给出了天数,而不是月数,对吧?它是否更清楚地写为 num_days 而不是几个月?例如。 : int num_days = (date2-date1).days();
    • 是的,那是我的错误 :) 现在稍微改正了。实际上,如果您想要长期正确的月数,最好使用 365.25/12 而不是 30。
    • 感谢您的支持,但抱歉,我不相信这种方法。任何基于所有月份的处理都大致相同,在一些特殊情况下会出错。就像闰年二月的病态一样。如果我将 d1 设为 1 月 30 日,将 d2 设为 3 月 1 日,那么天数的间隔将为 28(闰年)。仅看 28 天这个数字,我们无法知道这两个日期是否在同一个月内,或者可能相隔整个 2 月。这就是为什么我认为我们需要一个公历来计算两个日期之间有多少个完整的日历月。
    • 我终于完全理解了你的问题。然后可以使用 date::year() 和 date::month() 访问器,并且月份日期之间的差异是 int months = (data2.year() - date1.year())*12 + date2.month() - date1.month()
    • 上面的月份公式也是excel计算这个值的方式
    猜你喜欢
    • 2011-01-01
    • 2017-08-06
    • 1970-01-01
    • 2014-10-12
    • 2019-03-28
    • 2011-06-06
    相关资源
    最近更新 更多