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天。

我该如何制定逻辑来处理这个问题。我知道最近的一年是今年 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;

}

最佳答案

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 找到

要计算闰年,公历的逻辑是:如果年份能被 4 整除,则该年份为闰年,但也能被 100 整除的年份除外,在这种情况下,如果该年份是能被 400 整除。

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

但是,mktime 已经知道这一点,并且可以为您计算出来,正如已经演示的那样。

关于c++ - 如何获得一个月中的总天数并忽略周末,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11971380/

相关文章:

c++ - 删除 vector 中的重复文件名

c++ - 在没有分支的情况下测试固定集是否相等

c++ - AzerothCore 无法连接到服务器,可能是客户端发送的 WorldSocket 请求格式错误

Android NDK Native Activity OpenGL ES 1.1 三角形不会出现

c++ - boost::bind 是否有 QPointer 特化

c++ - 你如何强制模板匹配基类?

c++ - 结构原型(prototype)

c++ - 是否返回一个前向声明的结构未定义行为?

c++ - 谁在这里? g++ 还是 Visual Studio 2017?

c++ - 如何分析程序运行时间