如果我从gettimeofday()
获得time_t值或在Unix环境中兼容(例如,Linux,BSD),是否有一个紧凑的算法可以告诉我相应的周数一个月?
理想情况下,返回值的工作方式与%W
在strftime()
中的行为类似,只是在一个月内而不是一年中的一周内给出一周。
我认为Java有一个W
格式标记,它或多或少地像我要问的那样。
[David Nehme,Branan和Sparr在回答后发表以下所有内容。]
我意识到要以与%W
类似的方式返回此结果,我们希望计算到目前为止在当月发生的星期一数。如果该数字为零,则应返回0。
感谢David Nehme和Branan特别提出的解决方案,这些解决方案开始了正确的轨道。返回[使用Branan变量名称] ((ts->mday - 1) / 7)
的代码位表示当天之前发生的完整周数。
但是,如果我们计算到目前为止发生的星期一的数量,那么我们想要计算整数周的数量,包括今天,然后考虑剩余的分数周是否也包含任何星期一。
要确定在整个星期内取消星期一后剩余的小数周是否包含星期一,我们需要考虑ts->mday % 7
并将其与星期几ts->wday
进行比较。如果你写出组合很容易看到,但如果我们确保这一天不是星期日(wday > 0
),那么随时ts->wday <= (ts->mday % 7)
我们需要将星期一的数量增加1.这来自于考虑自月初以来的天数,以及根据第一个小数周内当前的当天,分数周是否包含星期一。
所以我会重写Branan的返回声明如下:
return (ts->tm_mday / 7) + ((ts->tm_wday > 0) && (ts->tm_wday <= (ts->tm_mday % 7)));
答案 0 :(得分:1)
假设你的第一周是第1周:
int getWeekOfMonth()
{
time_t my_time;
struct tm *ts;
my_time = time(NULL);
ts = localtime(&my_time);
return ((ts->tm_mday -1) / 7) + 1;
}
对于0索引,请在return语句中删除+1
。
答案 1 :(得分:1)
如果您将第一周定义为该月的第1-7天,第二周为第8-14天,那么以下代码将起作用。
int week_of_month( const time_t *my_time)
{
struct tm *timeinfo;
timeinfo =localtime(my_time);
return 1 + (timeinfo->tm_mday-1) / 7;
}
答案 2 :(得分:0)
考虑这个伪代码,因为我主要用C语法编写它,但假装我可以借用其他语言的功能(string-&gt; int assignment,string-&gt; time conversion)。适应或扩展您选择的语言。
int week_num_in_month(time_t timestamp) {
int first_weekday_of_month, day_of_month;
day_of_month = strftime(timestamp,"%d");
first_weekday_of_month = strftime(timefstr(strftime(timestamp,"%d/%m/01")),"%w");
return (day_of_month + first_weekday_of_month - 1 ) / 7 + 1;
}
显然,我假设您希望按照标准时间函数处理一周中的几周来处理本月的几周,而不是仅仅是1-7天,8-13天等。