0

如果我从gettimeofday()Unix 环境(例如 Linux、BSD)中获得或兼容的 time_t 值,是否有可用的紧凑算法能够告诉我该月内相应的周数?

理想情况下,返回值的工作方式类似于 中的%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 语句如下:

return (ts->tm_mday / 7) + ((ts->tm_wday > 0) && (ts->tm_wday <= (ts->tm_mday % 7)));

4

3 回答 3

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

于 2008-09-18T21:52:51.907 回答
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;

}
于 2008-09-18T22:03:57.310 回答
0

考虑一下这个伪代码,因为我主要用 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 天等。

于 2008-09-18T22:06:33.047 回答