Unix gettimeofday()-确定一个月内星期的兼容算法?

时间:2020-03-06 14:23:39  来源:igfitidea点击:

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

解决方案

假设第一周是第一周:

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-index,在return语句中删除" +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;

}

考虑一下这个伪代码,因为我主要使用C语法编写它,但假装我可以借用其他语言的功能(字符串-> int分配,字符串->时间转换)。适应或者扩展我们选择的语言。

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天等。