2

这是我的程序输出:

Select A Month-Year: 

1. 8-2012
2. 9-2012
3. 10-2012
4. 11-2012
5. 12-2012
6. 1-2013

在用户选择例如下个月的 9-2012 之后,我希望能够知道 2012 年 9 月(9-2012)有多少天。

那么如何获取周末(周六和周日)的所有日期,以便我也可以省略这些日期?

我现在正在使用ctime库来获取日期。

以下是我到目前为止所做的,但对于二月,每个闰年(4 年)是 29 天。

我该如何做一个逻辑来处理它。我知道最近的一年是今年 2012 年(今年),下一年是 2016 年,但我希望我的程序能够处理至少 40 年后。

if(month==4||month==6||month==9||month==11)
{
totalDays = 30;
}

if(month==1 || month==3 || month==5 || month==7 || month==8 || month== 10 || month==12 )
{
totalDays = 30;
}

if(month==2)
{
//February
totalDays = 28;

}
4

3 回答 3

2

mktime几乎可以为您完成所有工作。要查找两个日期之间的天数,每个日期由 a 指定struct tm,您可以使用:

int days_between (struct tm *tsa, struct tm *tsb) {
    time_t a = mktime(tsa);
    time_t b = mktime(tsb);
    return (b - a)/(60*60*24);
}

这将以秒为单位的差异除以一天中的秒数。

所以一年中的天数可以这样计算:

int days_of_year (int y) {
    struct tm tsa = {0};
    struct tm tsb = {0};

    tsa.tm_mday = 1;
    tsa.tm_year = y - 1900;

    tsb.tm_mday = 1;
    tsb.tm_year = y + 1 - 1900;

    return days_between(&tsa, &tsb);
}

月份中的天数相似,但您将保持年份不变,并使用tsb.

要计算工作日数,前 28 天总是至少有 8 个。然后,根据一个月中有多少天,您必须考虑剩余的天数。该tm_wday字段提供自星期日以来的天数作为struct tm.

    int dss = tsa.tm_wday;
    weekdays = 8;
    switch (days) {
    case 31: if (dss == 0 || dss == 6) weekdays += 1;
             dss = (dss + 1) % 7;
    case 30: if (dss == 0 || dss == 6) weekdays += 1;
             dss = (dss + 1) % 7;
    case 29: if (dss == 0 || dss == 6) weekdays += 1;
    default: break;
    }

完整的例子可以在http://ideone.com/qQo3U找到

计算闰年,公历的逻辑是:如果一年能被4整除,则为闰年,除非它也能被100整除,在这种情况下,如果能被400整除,则为闰年.

int is_leap_year (int y) {
    return (y % 4) ? 0 : ((y % 100) ? 1 : !(y % 400));
}

但是,mktime已经知道这一点,并且可以为您解决,正如已经证明的那样。

于 2012-08-15T15:44:46.197 回答
0

一个快速的谷歌发现了这个计算星期几的链接: http ://www.terra.es/personal2/grimmer/

你将不得不做一堆处理。

于 2012-08-15T14:43:16.723 回答
0

您需要计算出该月的第一天是哪个工作日(使用 mktime)。算出这个月的天数(并且小心二月),然后一点点算术就会告诉你有多少个星期六和星期日。

于 2012-08-15T15:09:56.290 回答