номер недели в году, вроде - PullRequest
27 голосов
/ 17 июля 2011

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

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

strftime имеет% U:

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

... но это конечно предполагает стандартное воскресеньеСубботняя неделя.

Ответы [ 5 ]

27 голосов
/ 29 декабря 2013

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

Time.now.strftime('%W')
22 голосов
/ 17 июля 2011
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 голосов
/ 17 июля 2011

Может быть, можно сделать так;

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
1 голос
/ 07 августа 2015

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

0 голосов
/ 20 мая 2019

Если вы хотите Номер недели 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.

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