Unix gettimeofday() - 用于确定月内周的兼容算法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

如果我从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)));

提问于
用户回答回答于

如果您将第一周定义为该月的第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;

}
用户回答回答于

考虑这个伪代码,因为我主要用C语法编写它,但假装我可以借用其他语言的功能(string-> int assignment,string-> 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天等。

扫码关注云+社区

领取腾讯云代金券