5

我正在制作一个需要time_t一年持续时间(in )的程序。

在其他方面,time_tDD/MM/YYYY + 持续时间 = time_tDD/MM/YYYY+1

所以它可能并不总是 365 天(29/02/2012 将变为 28/02/2013)

这是我带来的算法:

if YEAR is leap than
    if we are before the 29th feb' than return 365+1 days
    else if we are the 29th feb' than return 365-1 days
    else return 365 days
else if YEAR+1 is leap than
    if we are before or the 28th feb' than return 365 days
    else return 365+1 days
else return 365 days

在这里,一天是 60 * 60 * 24 秒

这个算法似乎有效。但我想知道是否有另一种方法可以在没有所有这些条件且只有 2 个可能的返回值的情况下执行此操作,或者只是一些“技巧”来优化事情。

我试图tm_yearstruct tm这样的增加:

// t is the input time_t
struct tm Tm (*localtime(&t));
if (Tm.tm_mon == 2 && Tm.tm_mday == 29) --Tm.tm_mday;
++Tm.tm_year;
return mktime(&Tm) - t;

但结果不是我想要的,我得到了 -1 小时,或者 -25 ......

我想这是因为一年不完全是 365 * 24 * 60 * 60。

4

3 回答 3

5

我会为此使用Boost,因为它已经实现了您正在寻找的内容:

#include <iostream>
#include <boost/date_time/gregorian/gregorian_types.hpp>
namespace date = boost::gregorian;

int main() {
   date::date_period dp(date::date(2012, 6, 4), date::date(2013, 6, 4));
   long days = dp.length().days();
   std::cout << "Days between dates: " << days << std::endl;

}

如果您想要更精确,那么您也可以使用posix_timeBoost :

namespace ptime = boost::posix_time;

...

ptime::ptime t1(date::date(2012, 6, 4), ptime::hours(0));
ptime::ptime t2(date::date(2013, 6, 4), ptime::hours(0));

ptime::time_duration td = t2 - t1;
std::cout << "Milliseconds: " << td.total_milliseconds() << std::endl;

通常time_t以秒为单位。因此,您只需要调用来td.total_seconds()获取您正在寻找的值。

于 2012-06-04T08:34:21.990 回答
2
if YEAR is leap than
    if we are before the 29th feb' than return 365+1 days
    else if we are the 29th feb' than return 365-1 days
    else return 365 days
else if YEAR+1 is leap than
    if we are before or the 28th feb' than return 365 days
    else return 365+1 days
else return 365 days

简化为:

if (YEAR is leap)
    if (< 29th Feb) return 365+1
    if (= 29th Feb) return 365-1
else if (YEAR+1 is leap)
    if (> 29th Feb) return 365+1

return 365

但是你为什么要这样做呢?拥有可读的代码比“技巧”优化要好得多。

正如@betabandido 所建议的那样,类似的东西date(year+1, mon, day) - date(year, mon, day)会更简单,更具可读性并且能够处理闰年、闰秒和九月缺少 11 天

于 2012-06-04T08:54:29.753 回答
0

一个太阳年的长度不是一个固定的数字。公历发明了一种补偿闰年的方法,这种方法并不完全精确。那就是“如果一年可以被4整除,则为闰年,除非它可以被100整除,但如果它可以被400整除,则再次为闰年。

我们在伊朗有一个更精确的日历,其中岁月改变了第二个地球围绕太阳转了一圈。在同一个链接中,您可以看到平均太阳年为 365.2422 天,春分之间的平均间隔为 365.2424 天。

此链接中,以秒为单位提供了有关太阳年(热带年)长度的更多详细信息。

于 2012-06-04T08:36:46.237 回答