Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Ruby计算日期_Ruby_Date - Fatal编程技术网

用Ruby计算日期

用Ruby计算日期,ruby,date,Ruby,Date,我有一些特定的功能要用日期来测试。我碰到了一个绊脚石。我需要从今天开始倒转14天来生成日期,但周末必须被忽略 例如: 今天是星期一,回去一天就到星期五了。回去两天就要到星期四了。我们总是落后两天。所以,当我在星期二着陆时,那需要到星期五,星期一到星期四。我让它工作了一周,但接下来的7天,它又开始了同样的循环 以下是我到目前为止的情况: def date_calc_minus(number) date = Date.today - number.to_i day = date.strfti

我有一些特定的功能要用日期来测试。我碰到了一个绊脚石。我需要从今天开始倒转14天来生成日期,但周末必须被忽略

例如:

今天是星期一,回去一天就到星期五了。回去两天就要到星期四了。我们总是落后两天。所以,当我在星期二着陆时,那需要到星期五,星期一到星期四。我让它工作了一周,但接下来的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

我知道这并不漂亮,但我已经看了太久,我已经成为隧道幻想。有没有一种简单的方法来实现这一点?

注意使用
sunday?
方法来确定某个日期是否恰好是周日

require "date"
def date_calc_minus(number)
  d = Date.today
  number.times do
    d -= 1
    d -= 2 if d.sunday?
  end
  d
end

我的解决方案以牺牲简单性为代价,强调效率。我假设开始日期是工作日

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
需要“日期”
def回望(开始日期,n)
星期一之后的天数=开始日期.wday-1
返回开始日期-n如果n为0?天数+2:0)
结束

start\u date=date.today
#=> #
开始日期.wday
#=>1(星期一)
回望(开始日期,0)
#=> #
回顾(开始日期,1)
#=> #
回顾(开始日期,5)
#=> #
回顾(开始日期,6)
#=> #
回顾(开始日期,7)
#=> #
回顾(开始日期,11)
#=> #
回顾(开始日期,16)
#=> #

开始日期+=2
#=> #
开始日期.wday
#=>3(星期三)
回望(开始日期,0)
#=> #
回顾(开始日期,1)
#=> #
回顾(开始日期,2)
#=> #
回顾(开始日期,3)
#=> #
回顾(开始日期,5)
#=> #
回顾(开始日期,10)
#=> #
回顾(开始日期,15)
#=> #
回顾(开始日期,12345)
#=> #

如果今天是4月30日星期一,那么预期的产出是什么?4月27日星期五我认为星期一应该到星期四,因为“所以,当我在星期二着陆时,需要到星期五,星期一到星期四”很简单!!谢谢你,这是一个非常聪明的解决方案,很好的解决方案。或者,
number.times{d-=d.monday±3:1}
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)>