Подтвердить что ты не робот

Недельный номер года, вид

Предпочтительно в рубине, но логика будет достаточно хороша...

Мне нужен номер недели, учитывая, что неделя нестандартная. Итак, скажите, что вы определили неделю как субботу → пятницу. Затем, учитывая дату, номер недели которой (1-52)?

strftime имеет% U:

> Time.now.strftime('%U')
> => "28"

... но это, конечно, предполагает стандартное воскресенье → субботнюю неделю.

4b9b3361

Ответ 1

Используйте %W вместо %U, он использует понедельник как первый день недели.

Time.now.strftime('%W')

Ответ 2

class Date
  def sweek
    date = self + 1
    date.cweek
  end
end

# Today is Sunday, 17 July
Date.today.cweek
#=> 28
Date.today.sweek
#=> 29

Ответ 3

Может быть, может так:

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

Ответ 4

Мы можем выяснить, как сдвинуть номер недели с того, что возвращается %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:

  • 2014 год начинается с Wed, но наш алгоритм ставит 1 января на неделю 0, но это должна быть неделя 1 (%U ставит 1 января в неделю 1, если в воскресенье).
  • Год 2007 (и другие годы, начинающиеся с Mon или Tue) приведут к тому, что дни до первого ср будут на неделе -1, но они должны быть на неделе 0.

Чем больше дней недели вы поправляете, тем больше случаев у вас будет. Сат-пт неделю, вероятно, будет больше проблем, потому что вы корректируете 6 из 7 дней.

Ответ 5

Если вам нужен номер недели 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.