Ответ 1
Используйте %W
вместо %U
, он использует понедельник как первый день недели.
Time.now.strftime('%W')
Предпочтительно в рубине, но логика будет достаточно хороша...
Мне нужен номер недели, учитывая, что неделя нестандартная. Итак, скажите, что вы определили неделю как субботу → пятницу. Затем, учитывая дату, номер недели которой (1-52)?
strftime имеет% U:
> Time.now.strftime('%U')
> => "28"
... но это, конечно, предполагает стандартное воскресенье → субботнюю неделю.
Используйте %W
вместо %U
, он использует понедельник как первый день недели.
Time.now.strftime('%W')
class Date
def sweek
date = self + 1
date.cweek
end
end
# Today is Sunday, 17 July
Date.today.cweek
#=> 28
Date.today.sweek
#=> 29
Может быть, может так:
def week_dates( week_num )
year = Time.now.year
week_start = Date.commercial( year, week_num, 1 )
week_end = Date.commercial( year, week_num, 7 )
week_start.strftime( "%m/%d/%y" ) + ' - ' + week_end.strftime(
"%m/%d/%y" )
end
Мы можем выяснить, как сдвинуть номер недели с того, что возвращается %U
(Sun начинает неделю), рассматривая этот фрагмент календаря:
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
Пусть нам нужна неделя Wed-Tue, сокращенная как формат %?
(поэтому нам не нужно печатать "Wed начинается неделя" ).
Мы хотим:
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]
}
Если вам нужна неделя Sat-Fri, вы можете вычесть 1 за дни, которые не являются субботами:
d.wday == 6 ? origw : origw-1
Обратите внимание, что есть несколько случаев краев, в зависимости от того, что вы выбираете для своей недели (обработка этих данных оставлена как упражнение для читателя). Для нашей недели Wed-Tue:
%U
ставит 1 января в неделю 1, если в воскресенье).Чем больше дней недели вы поправляете, тем больше случаев у вас будет. Сат-пт неделю, вероятно, будет больше проблем, потому что вы корректируете 6 из 7 дней.
Если вам нужен номер недели ISO, используйте% V согласно документации strftime
Пример:
require 'date'
puts DateTime.parse('2018-12-30 23:59:59').strftime('%G-%V')
puts DateTime.parse('2018-12-31 00:00:00').strftime('%G-%V')
Результат:
2018-52
2019-01
Обратите внимание, что для года использовался% G, а не% Y.