2015-06-16 4 views
3

В рубине, как я могу получить каждый 14-й день года, переходя взад и вперед с даты.Получите массив, включающий каждый 14-й день с данной даты

Так что рассмотрим, что мне выставили счет за 2 недели утилизации сегодня, 6-16-2015. Как я могу получить массив каждого дня выставления счетов за рециркуляцию в этом году на основе этой даты.

ответ

5

Дата имеет step метод:

require 'date' 

d = Date.strptime("6-16-2015", '%m-%d-%Y') # strange date format 
end_year = Date.new(d.year, -1, -1) 
p d.step(end_year, 14).to_a 

# =>[#<Date: 2015-06-16 ((2457190j,0s,0n),+0s,2299161j)>, #<Date: 2015-06-30 ((2457204j,0s,0n),+0s,2299161j)>, ... 

# Going backward: 
begin_year = Date.new(d.year, 1, 1) 
p d.step(begin_year,-14).to_a 

# =>[#<Date: 2015-06-16 ((2457190j,0s,0n),+0s,2299161j)>, #<Date: 2015-06-02 ((2457176j,0s,0n),+0s,2299161j)>,... 
1

Вы можете сделать это следующим образом:

require 'date' 

date_str = "6-16-2015" 

d = Date.strptime(date_str, '%m-%d-%Y') 
f = Date.new(d.year) 
((f + (f-d).abs % 14)..Date.new(d.year,-1,-1)).step(14).to_a 
    #=> [#<Date: 2015-01-13 ((2457036j,0s,0n),+0s,2299161j)>, 
    # #<Date: 2015-01-27 ((2457050j,0s,0n),+0s,2299161j)>, 
    # ... 
    # #<Date: 2015-06-16 ((2457190j,0s,0n),+0s,2299161j)>, 
    # ... 
    # #<Date: 2015-12-29 ((2457386j,0s,0n),+0s,2299161j)>] 

На основе второго предложения вашего вопроса, я предполагаю, что вы просто хотите массив всех дат в данном году, которые разделены на две недели и включают данный день.

1

Более описательным и легко понять решение:

require 'date' 
    current_date = Date.parse "16-june-15" 
    start_date = Date.parse '1-jan-15' 
    end_date = Date.parse '31-dec-15' 
    interval = 14 
    result = current_date.step(start_date, -interval).to_a 
    result.sort!.pop 
    result += current_date.step(end_date, interval).to_a 
0

Я попытался Mathy модуль предвзятый подход, который оказался неожиданно сбивает с толку.

require 'date' 

a_recycle_date_string = "6-17-2015" 
interval = 14 

a_recycle_date = Date.strptime(a_recycle_date_string, '%m-%d-%Y') 
current_year = a_recycle_date.year 
end_of_year = Date.new(current_year, -1, -1) 

# Find out which index of the first interval's days is the first recycle day 
# of the year the (1 indexed) 
remainder = (a_recycle_date.yday) % interval 
# => 0 

# make sure remainder 0 is treated as interval-1 so it doesn't louse 
# the equation up 
n_days_from_first_recycling_yday_of_year = (remainder - 1) % interval 


first_recycle_date_this_year = Date.new(current_year, 
             1, 
             1 + n_days_from_first_recycling_yday_of_year) 

first_recycle_date_this_year.step(end_of_year, interval).to_a 
Смежные вопросы