一年零一个时间范围

时间:2014-10-15 15:36:24

标签: ruby-on-rails ruby

我正在尝试通知我的客户他们的订阅即将到期。这就是我寻找这些用户通知他们的方式。他们将在他们订阅的日期收费+ 1。年:

User.where(subscribed_at: 53.weeks.ago.beginning_of_day..53.weeks.ago.beginning_of_day)

我的问题是这会在闰年中产生问题吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

Rails为"精确时间计算提供Time#advance"

Time.now.advance(years: -1, weeks: -1)
#=> 2013-10-08 17:54:36 +0200

Time#all_day返回一整天的范围:

Time.now.advance(years: -1, weeks: -1).all_day
#=> 2013-10-08 00:00:00 +0200..2013-10-08 23:59:59 +0200

答案 1 :(得分:1)

我认为您应该使用1.year.ago,因为52.weeks.ago不等于整年(52 * 7 = 364天)。

使用1.year.ago会更好,因为它实际上更改了DateTime的year字段,没有别的:

1.9.3p489 :005 > 2.year.ago
# => Mon, 15 Oct 2012 11:51:44 EDT -04:00 
1.9.3p489 :006 > 5.year.ago
# => Thu, 15 Oct 2009 11:51:47 EDT -04:00 
1.9.3p489 :007 > 999.year.ago
# => Sun, 15 Oct 1015 11:51:50 LMT -04:56 # For some reason the TimeZone changed!

在您的情况下,我会使用以下逻辑: NOPE NOPE,我会使用@Stefan的答案!

range = (1.year.ago-1.week).beginning_of_day..(1.year.ago-1.week).end_of_day
User.where(subscribed_at: range)