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