Unix gettimeofday () - совместимый алгоритм определения недели в течение месяца? - PullRequest
0 голосов
/ 19 сентября 2008

Если у меня есть значение time_t из gettimeofday() или совместимо в среде Unix (например, Linux, BSD), существует ли компактный алгоритм, который мог бы сообщить мне соответствующий номер недели в течение месяца?

В идеале возвращаемое значение должно работать аналогично тому, как %W ведет себя в strftime(), за исключением указания недели в месяце, а не недели в году.

Я думаю, что у Java есть токен форматирования W, который делает что-то более или менее похожее на то, что я спрашиваю.


[Все, что написано ниже после того, как ответы были опубликованы Дэвидом Неемом, Брананом и Спарром.]

Я понял, что чтобы вернуть этот результат аналогично %W, мы хотим посчитать количество понедельников, которые произошли в этом месяце. Если это число равно нулю, то должно быть возвращено 0.

Спасибо Дэвиду Неме и Бранану, в частности, за их решения, которые положили начало в правильном направлении. Бит кода, возвращающего [с использованием имен переменных Бранана] ((ts->mday - 1) / 7) сообщает количество полных недель, которые произошли до текущего дня.

Однако, если мы подсчитываем количество понедельников, которые произошли до сих пор, то мы хотим подсчитать количество целых недель, включая сегодня, а затем рассмотрим, содержит ли оставшаяся часть дробной недели также какие-либо понедельники.

Чтобы выяснить, содержит ли дробная неделя после вычитания целых недель понедельник, нам нужно рассмотреть ts->mday % 7 и сравнить его с днем ​​недели ts->wday. Это легко увидеть, если вы напишите комбинации, но если мы обеспечим, чтобы день не был воскресным (wday > 0), тогда в любое время ts->wday <= (ts->mday % 7) нам нужно увеличить число понедельников на 1. Это зависит от количества число дней с начала месяца, а также, содержит ли на основе текущего дня недели первую дробную неделю понедельник.

Итак, я бы переписал оператор возврата Бранана следующим образом:

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

Ответы [ 3 ]

1 голос
/ 19 сентября 2008

Если вы определяете первую неделю как дни 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;

}
1 голос
/ 19 сентября 2008

Предполагая, что ваша первая неделя - неделя 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-индекса отбросьте +1 в операторе возврата.

0 голосов
/ 19 сентября 2008

Рассмотрим этот псевдокод, поскольку я пишу его в основном в синтаксисе языка Си, но притворяюсь, что могу позаимствовать функциональность из других языков (строка-> 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 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...