2013-03-20 48 views
1

如果我有两个日期即。Ruby日期范围包括特定日期

checkin = Date.parse('params[:checkin]) 
checkout = Date.parse('params[:checkout]) 

如何检查这两个日期之间是否有星期一?

有什么建议吗?

回答

6
(checkin..checkout).any?(&:monday?) 

此外,我不知道如果范围#任何?实例化一个数组或不。 以防万一,如果确实如此,这将是最好添加额外的检查,以避免占用大量内存见下文更新):

checkout - checkin > 7 || (checkin..checkout).any?(&:monday?) 

而且还确保签是< =结账。

UPD:我刚刚仔细检查过。没有必要检查是否checkout - checkin大于某物。 Range#any?是足够聪明,不会在内部创建一个数组(至少在红宝石1.9.3):

1.9.3p327 :004 > checkin, checkout = Date.new, Date.new + 9000.years 
=> [Mon, 01 Jan -4712, Sun, 01 Jan 4288] 

1.9.3p327 :005 > `ps -o vsize= #{$$}`.strip.to_i 
=> 3161660 # memory usage of the current process 

1.9.3p327 :006 > (checkin..checkout).any?(&:monday?) 
=> true 
1.9.3p327 :007 > `ps -o vsize= #{$$}`.strip.to_i 
=> 3161660 # memory usage of the current process stays the same 

1.9.3p327 :008 > (checkin..checkout).to_a.any?(&:monday?) # force .to_a 
=> true 
1.9.3p327 :009 > `ps -o vsize= #{$$}`.strip.to_i 
=> 3421680 # memory usage increases and also the previous line was very slow 
+0

甜。 TY非常多 – Lee 2013-03-20 14:07:37

+0

+1对你来说不过 – Aleks 2013-03-20 14:12:17

+1

你可以改进你的第二条语句到'checkout - checkin> 5'或'checkout - checkin> = 6'。 – 2013-03-20 14:51:20

2

这个答案是awsum, (checkin..checkout).any?(&:monday?)

,但你也可以做如下,

(checkin..checkout).cover?(Date.today) # you can give date to it. 

仅供参考,@DNNX和Aleks,我们必须将Date作为参数来覆盖,因为我们将它应用于DateRange。