如何检查ANSI C中的周数是偶数还是奇数?

时间:2013-07-18 09:36:00

标签: c date

我是一个小型的应用程序,甚至或不返回。

time_t now = time(0); 
tm *ltm = localtime(&now);
int twin=(ltm->tm_yday/7)%2

但独立于一年的第一天,所以它返回

周一,周四,我们等 0,1,1,1,1,1,1
在下周 1,0,0,0,0,0,0

在明年
星期一,星期四,我们等 0,0,1,1,1,1,1
在下周 1,1,0,0,0,0,0

等等.. 双 - 如果数字模2 = 0
因此,我必须在每个星期日或星期一添加班次更改周数。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您假设第一周恰好有7天不正确。

例如2013年1月1日是星期二,所以第一周只有5天。

使用strftime怎么样?类似的东西:

time_t now = time(0); 
tm *ltm = localtime(&now);
char weekNr[3];
strftime(weekNr, sizeof(weekNr), "%W", ltm);
int isOdd = atoi(weeknr) % 2;

答案 1 :(得分:0)

你所谓的 twin ,用英语通常称为甚至

关于你的问题,这里的问题是你没有正确计算周数:你只是除以7,这还不够,因为年初和周开始每年都不同。

此外,有几种不同的方法可以决定哪一个是第1周。例如,参见this code,开始使用。

更新:从eglibc源代码中无耻地复制:

1)当前年份的周数作为十进制数,范围00到53,从第一个星期日开始,作为第01周的第一天(strftime("%U")):

tp->tm_yday - tp->tm_wday + 7) / 7

2)当前年份的周数作为十进制数,范围00到53,从第一个星期一开始,作为第01周的第一天(strftime("%W")):

(tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7

3)当前年份的ISO 8601周数(见注释)为十进制数,范围为01到53,其中第1周是新年至少有4天的第一周({{1} }):

这很复杂......所以你对@MaikuMori使用strftime("%V")“%V”strftime``, but with atoi()`的想法更好。