Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何计算一个月内的总日数而忽略周末_C++ - Fatal编程技术网

C++ 如何计算一个月内的总日数而忽略周末

C++ 如何计算一个月内的总日数而忽略周末,c++,C++,这是我的程序输出: 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天 我该如何做一个逻辑来处理这个问题。我知道最近一年

这是我的程序输出:

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;

}

一个快速的google找到了这个用于计算星期几的链接:


你需要做一系列的处理。

你需要计算出一个月的第一天是哪一个工作日(使用mktime)。算出一个月的天数(注意二月),一点算术就会告诉你有多少个周六和周日。

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;
    }
完整的示例可以在

要计算闰年,公历的逻辑是:如果一年可以被4整除,那么一年就是闰年;如果一年也可以被100整除,那么如果一年可以被400整除,那么一年就是闰年

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

然而,
mktime
已经知道了这一点,并且可以为您找到答案,正如已经演示的那样。

看看。我知道这是一个非常古老的答案,但是您应该在
之间的
天内使用而不是
b-a
。我假设POSIX没有溢出,所以
b-a
是可以的。