Рассчитать даты в рубине - PullRequest
       3

Рассчитать даты в рубине

0 голосов
/ 30 апреля 2018

У меня есть определенные функции для тестирования с датами Я столкнулся с камнем преткновения. Мне нужно вернуться в обратном направлении через 14 дней с сегодняшнего дня, чтобы сгенерировать дату, но выходные должны игнорироваться.

Пример:

Сегодня понедельник, возвращение на 1 день приведет меня к пятнице. Возвращение на 2 дня приведет меня к четвергу. Мы всегда на два дня позади. Итак, когда я приземляюсь во вторник, нужно идти в пятницу и с понедельника по четверг. Я работаю в течение 1 недели, но в следующие 7 дней он снова запускает тот же цикл.

Вот что у меня есть:

def date_calc_minus(number)


date = Date.today - number.to_i
  day = date.strftime('%a %e %B %Y').split(' ')[0]


  case
    when day.include?('Sun')
      puts day
      calculated_date = date - 2
    when day.include?('Sat')
      puts day
      calculated_date = date - 2
    else
      puts day
      calculated_date = date - 2
      if calculated_date.strftime('%a %e %B %Y').split(' ')[0].include?('Sun')
        calculated_date = calculated_date - 2
      elsif calculated_date.strftime('%a %e %B %Y').split(' ')[0].include?('Sat')
        calculated_date = calculated_date - 2
      end
  end

  calculated_date.strftime('%a %e %B %Y')
end

start = 1
stop = 14
range = start.to_i.upto(stop.to_i).to_a

range.each_with_index do |number, index|
  puts date_calc_minus(number)
end


#=>



Sun
Fri 27 April 2018
Sat
Thu 26 April 2018
Fri
Wed 25 April 2018
Thu
Tue 24 April 2018
Wed
Mon 23 April 2018
Tue
Fri 20 April 2018
Mon
Thu 19 April 2018
Sun
Fri 20 April 2018
Sat
Thu 19 April 2018
Fri
Wed 18 April 2018
Thu
Tue 17 April 2018
Wed
Mon 16 April 2018
Tue
Fri 13 April 2018
Mon
Thu 12 April 2018

Я понимаю, что это не красиво, но я смотрю на это слишком долго, и у меня появилось туннельное зрение. Есть ли простой способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Мое решение подчеркивает эффективность за счет простоты. Я предполагаю, что начальная дата - будний день.

require 'date'

def lookin_back(start_date, n)
  days_after_monday = start_date.wday - 1
  return start_date - n if n <= days_after_monday
  weeks, days = (n - days_after_monday).divmod(5)
  start_date - days_after_monday - 7*weeks - (days > 0 ? days + 2 : 0) 
end

start_date = Date.today
  #=> #<Date: 2018-04-30 ((2458239j,0s,0n),+0s,2299161j)>
start_date.wday
  #=> 1 (Monday)

lookin_back(start_date, 0)
  #=> #<Date: 2018-04-30 ((2458239j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 1)
  #=> #<Date: 2018-04-27 ((2458236j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 5)
  #=> #<Date: 2018-04-23 ((2458232j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 6)
  #=> #<Date: 2018-04-20 ((2458229j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 7)
  #=> #<Date: 2018-04-19 ((2458228j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 11)
  #=> #<Date: 2018-04-13 ((2458222j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 16)
  #=> #<Date: 2018-04-06 ((2458215j,0s,0n),+0s,2299161j)>

start_date += 2
  #=> #<Date: 2018-05-02 ((2458241j,0s,0n),+0s,2299161j)>
start_date.wday
  #=> 3 (Wednesday)

lookin_back(start_date, 0)
  #=> #<Date: 2018-05-02 ((2458241j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 1)
  #=> #<Date: 2018-05-01 ((2458240j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 2)
  #=> #<Date: 2018-04-30 ((2458239j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 3)
  #=> #<Date: 2018-04-27 ((2458236j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 5)
  #=> #<Date: 2018-04-25 ((2458234j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 10)
  #=> #<Date: 2018-04-18 ((2458227j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 15)
  #=> #<Date: 2018-04-11 ((2458220j,0s,0n),+0s,2299161j)>
lookin_back(start_date, 12345)
  #=> #<Date: 1971-01-06 ((2440958j,0s,0n),+0s,2299161j)>
0 голосов
/ 30 апреля 2018

Обратите внимание на использование метода sunday?, чтобы определить, является ли определенная дата воскресением.

require "date"
def date_calc_minus(number)
  d = Date.today
  number.times do
    d -= 1
    d -= 2 if d.sunday?
  end
  d
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...