1

我有一个小应用程序,它甚至可以返回一周。

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

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

mon, thu, we, etc
0,1,1,1,1,1,1
in the next week
1,0,0,0,0,0,0

in the next year
mon, thu, we, etc
0, 0,1,1,1,1,1
在下周
1,1,0,0,0,0,0

等等.. Twin- 如果数字模 2 = 0
所以我必须添加 shift 来改变周每个星期日或星期一的号码。有什么建议么?

4

2 回答 2

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;
于 2013-07-18T10:00:55.177 回答
0

你所说的双胞胎,在英语中通常被称为偶数

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

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

更新:从 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 天的第一周(strftime("%V")):

嗯,这很复杂......所以你对@MaikuMori 使用strftime``, but with“%V” , and then parse the result, withatoi()` 的想法更好。

于 2013-07-18T10:02:40.587 回答