2011-07-16 5 views
20

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

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

STRFTIME имеет% U:

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

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

+0

возможно использовать этот стандарт, а затем рассчитать собственный счет на основе сегодняшнего дня недели ... – Randy

+14

Воскресенье -> Суббота - только американский стандарт. Международный стандарт - понедельник -> воскресенье. – sawa

ответ

2

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

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 
+0

Ищет номер недели данной даты. – jsharpe

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

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

приятный, но +0 для обезьяны, патчирующий основной класс, кстати странно 'Time.new.strftime ('% W')! = Time.new.to_date.cweek' – akostadinov

+2

@akostadinov: Вероятно, вы получили это давно, но для потомков 'Time.new.strftime ('% W')' возвращает String while 'Time.new.to_date.cweek' возвращает целое число, поэтому они не должны быть равны. – ray

20

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

Time.now.strftime('%W') 
+1

Но это нулевое индексирование, в отличие от ответа 'Date.today.cweek' формы @ fl00r. –

1

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

Давайте путь мы хотим Wed- Tue week, сокращенно формат %? (поэтому нам не нужно печатать «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

Обратите внимание, как мы-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.

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

Смежные вопросы