计算的天2日期之间的数目的执行 [英] The implementation of calculating the number of days between 2 dates

查看:130
本文介绍了计算的天2日期之间的数目的执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是计算两个日期之间的天数的最有效方法是什么?基本上,我问怎么了favourate日期时间库实现的。

我很快就实现了一个解决方案,那就是〜O(N),因为我通过每4个年51迭代运行。 ($附后C $ C)

有人问我的介绍到的问题,电脑类解决来实现这一点,但他们只是通过迭代中的每天的,而不是每4年..所以我并不满足于这种解决方案并提出了如下的。然而,有一个更有效的解决方案可用?如果是的话,他们是如何做到的呢?

 的#include<的iostream>

使用名字空间std;

#定义check_leap(年)((年%400 == 0)||((年%4 == 0)及及(每年100%= 0))!)
#定义调试(N)COUT<< N'LT;< ENDL

INT get_days(INT月,布尔飞跃){
    如果(月== 2){
        如果(飞跃)返回29;
        返回28;
    }否则,如果(月== 1 ||一个月== 3 ||月== || 5月7 == ||一个月== || 8月== 10 ||一个月== 12){
        返回31;
    } 其他 {
        返回30;
    }
}


INT天[] = {31,59,90,120,151,181,212,243,273,304,334};

#定义days_prior_to_month(N)天[N-2]
INT num_days_between(INT MONTH1,诠释DAY1,诠释MONTH2,INT DAY2,布尔飞跃){
    如果(MONTH2> MONTH1)
        返程((days_prior_to_month(MONTH2) -  days_prior_to_month(MONTH1 + 1))+ get_days(MONTH1,飞跃) - 第1天+ 1 +第2天)+((LEAP&安培;&安培; MONTH1< = 2及和2< = MONTH2)?1:0);
    否则,如果(MONTH2 == MONTH1)
        返回第2天;
    返回-1;
}

INT主(INT ARGC,字符* argv的[]){
    INT年,月,日,YEAR2,MONTH2,第2天;
    COUT<< 年: ; CIN>>年;
    COUT<< 月: ; CIN>>月;
    COUT<< 日: ; CIN>>日;
    COUT<< 2年; CIN>> YEAR2;
    COUT<< 2个月; CIN>> MONTH2;
    COUT<< 第2天:; CIN>>第2天;

    INT总= 0;
    如果(YEAR2!=年){
        INT leapyears = 0;
        总+ = num_days_between(月,日,12日,31日,check_leap(年));
        调试(总);
        共有+ = num_days_between(1,1,MONTH2,第2天,check_leap(YEAR2));
        调试(总);
        INT originalyear =年;
        今年++;
        年=年+年4%;
        而(一年< = year2-1){
            leapyears + = check_leap(年)? 1:0;
            今年+ = 4;
        }

        共有+ = leapyears * 366;
        调试(总);
        共有+ = MAX(YEAR2  -  originalyear  -  leapyears  -  1,0)* 365;
        调试(总);

    } 其他 {
        总= num_days_between(月,日,MONTH2,第2天,check_leap(年));
    }
        COUT<< 天在总数之间:<<总<< ENDL;
    系统(暂停);
    返回0;
}
 

解决方案

您可以转换日期为儒略天数在O(1)。

两者相减儒略日数。

What's the most efficient way to calculate the number of days between 2 dates? Basically I'm asking how our favourate datetime libraries are implemented.

I quickly implemented a solution that is ~O(n) as I run through 1 iteration per 4 years. (Code attached below)

I was asked by an intro to problem solving with computers class to implement this, but they're simply iterating through everyday instead of every 4 years.. so I'm not content with that solution and came up with the one below. However, is there a more efficient solution available? If so, how do they accomplish it?

#include <iostream>

using namespace std;

#define check_leap(year) ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
#define debug(n) cout << n << endl

int get_days(int month, bool leap){
    if (month == 2){
        if (leap) return 29;
        return 28;
    } else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
        return 31;
    } else {
        return 30;
    }
}


int days[] = {31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

#define days_prior_to_month(n) days[n-2]
int num_days_between(int month1, int day1, int month2, int day2, bool leap){
    if (month2 > month1)
        return ((days_prior_to_month(month2) - days_prior_to_month(month1+1)) + get_days(month1, leap) - day1 + 1 + day2) + ((leap &&  month1 <= 2 && 2 <= month2) ? 1 : 0);
    else if (month2 == month1)
        return day2;
    return -1;
}

int main(int argc, char * argv[]){
    int year, month, day, year2, month2, day2;
    cout << "Year: "; cin >> year;
    cout << "Month: "; cin >> month;
    cout << "Day: "; cin >> day;
    cout << "Year 2: "; cin >> year2;
    cout << "Month 2: "; cin >> month2;
    cout << "Day 2: "; cin >> day2;

    int total = 0;
    if (year2 != year){
        int leapyears = 0;
        total += num_days_between(month, day, 12, 31, check_leap(year));
        debug(total);
        total += num_days_between(1, 1, month2, day2, check_leap(year2));
        debug(total);
        int originalyear = year;
        year++;
        year = year + year % 4;
        while (year <= year2-1){
            leapyears += check_leap(year) ? 1 : 0;
            year += 4;
        }

        total += leapyears * 366;
        debug(total);
        total += max(year2 - originalyear - leapyears - 1, 0) * 365;
        debug(total);

    } else {
        total = num_days_between(month, day, month2, day2, check_leap(year));
    }
        cout << "Total Number of Days In Between: " << total << endl;
    system("PAUSE");
    return 0;
} 

解决方案

You can convert a date to a Julian day number in O(1).

Subtract the two Julian day numbers.

这篇关于计算的天2日期之间的数目的执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆