这是我的节目输出:
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月(2012年9月)的天数。
然后如何获得周末(周六和周日)的所有日期,以便我也可以省略这些日期?
我现在正在使用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 :(得分: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
找到要计算闰年,公历的逻辑是:如果年份可以被4整除,则一年是闰年,除非它也可以被100整除,在这种情况下,如果它是100,则为闰年可以被400整除。
int is_leap_year (int y) {
return (y % 4) ? 0 : ((y % 100) ? 1 : !(y % 400));
}
然而,mktime
已经知道了这一点,并且可以为您解决,正如已经证明的那样。
答案 1 :(得分:0)
快速谷歌发现此链接用于计算星期几: http://www.terra.es/personal2/grimmer/
你必须做一堆处理。
答案 2 :(得分:0)
您需要确定每月第一天的工作日(使用mktime)。计算一个月中的天数(并且在二月份时要小心),然后稍微算一下就会告诉你有多少个星期六和星期日。