Если у меня есть значение 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)));