Мы можем выяснить, как сместить номер недели с того, что возвращается на %U
(Солнце начинает неделю), рассмотрев этот фрагмент календаря:
August 2015
Su Mo Tu We Th Fr Sa
1 %U => 30
2 3 4 5 6 7 8 %U => 31
9 10 11 12 13 14 15 %U => 32
Давайте так, как мы хотим, чтобы мы работали в среду по субботам, сокращенно как формат %?
(поэтому нам не нужно печатать "среда начинается неделя").
Мы хотим:
August 2015
We Th Fr Sa Su Mo Tu
1 2 3 4 %? => 30
5 6 7 8 9 10 11 %? => 31
12 13 14 15 %? => 32
Обратите внимание, как We-Sa остается в одном и том же номере недели в обеих системах, а все остальные дни недели переносятся на предыдущую неделю в %?
.
Итак, мы можем сделать это:
startd = Date.new(2015, 8, 1)
# show whole month
pp (startd .. (startd >> 1)-1).map {|d|
origw = d.strftime('%U').to_i
# Adjust our new week number if not We-Sa:
neww = ([3, 4, 5, 6].include?(d.wday) ? origw : origw-1)
[d.to_s, origw, neww]
}
Если вам нужна суббота-пятница, вы можете вычесть 1 для дней, не являющихся субботой:
d.wday == 6 ? origw : origw-1
Обратите внимание, что есть несколько крайних случаев, в зависимости от того, какую неделю вы выберете (работа с ними оставлена в качестве упражнения для читателя). Для нашей недели в среду:
- Год 2014 начинается с ср., Но наш алгоритм помещает 1 января в неделю 0, но это должна быть неделя 1 (
%U
устанавливает 1 января в неделю 1, если это воскресенье).
- Год 2007 (и другие годы, начинающиеся в понедельник или вторник) приведут к тому, что дни до первой среды будут на неделе -1, но они должны быть на неделе 0.
Чем больше дней недели вы настраиваете, тем больше у вас будет крайних случаев. В субботу-пятницу, вероятно, будет больше всего проблем, потому что вы настраиваете 6 из 7 дней.