我正在尝试通知我的客户他们的订阅即将到期。这就是我寻找这些用户通知他们的方式。他们将在他们订阅的日期收费+ 1。年:
User.where(subscribed_at: 53.weeks.ago.beginning_of_day..53.weeks.ago.beginning_of_day)
我的问题是这会在闰年中产生问题吗?或者有更好的方法吗?
答案 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)