2012-08-15 57 views
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库提取我的日期。

以下是我做到目前为止,但2月,每闰年(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; 

} 
+0

看看http://pocoproject.org/slides/070-DateAndTime.pdf。 – Paranaix 2012-08-15 14:49:47

回答

0

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

2

mktime可以为你做几乎所有的工作。要找到天的两个日期,分别由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

找到要计算闰年,对于格里历的逻辑是:A年为闰年如果年份是被4整除,除非它是也整除100,在这种情况下,它是一个闰年,如果它是整除400

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

然而,mktime已经知道这一点,自己看着办吧你,因为已经得到证实。

+0

我知道这是一个非常古老的答案,但是你应该在days_between中使用['difftime(b,a)'](http://www.cplusplus.com/reference/ctime/difftime/)而不是'b - a' '。 – Holt 2016-02-04 11:19:11

+0

我假设POSIX并没有溢出,所以'B - A'很好。 – jxh 2016-02-04 14:46:26

相关问题