Ruby on rails 一年零一周时间范围
我正试图通知我的客户他们的订阅即将到期。这就是我希望那些用户通知他们的方式。他们将在认购日期+1.5年后支付账单:Ruby on rails 一年零一周时间范围,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正试图通知我的客户他们的订阅即将到期。这就是我希望那些用户通知他们的方式。他们将在认购日期+1.5年后支付账单: User.where(subscribed_at: 53.weeks.ago.beginning_of_day..53.weeks.ago.beginning_of_day) 我的问题是,这会造成闰年的问题吗?或者有更好的方法吗?我认为你应该使用1.year.ago,因为52.weeks.ago不等于一整年(52*7=364天) 使用1.year.ago会更好,因为它实际上更改了
User.where(subscribed_at: 53.weeks.ago.beginning_of_day..53.weeks.ago.beginning_of_day)
我的问题是,这会造成闰年的问题吗?或者有更好的方法吗?我认为你应该使用
1.year.ago
,因为52.weeks.ago
不等于一整年(52*7=364天)
使用1.year.ago
会更好,因为它实际上更改了日期时间的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!
在你的情况下,我会使用以下逻辑:不,不,我会使用@Stefan的答案强>
range = (1.year.ago-1.week).beginning_of_day..(1.year.ago-1.week).end_of_day
User.where(subscribed_at: range)
Rails提供了“精确的时间计算”:
返回一整天的范围:
Time.now.advance(years: -1, weeks: -1).all_day
#=> 2013-10-08 00:00:00 +0200..2013-10-08 23:59:59 +0200
我想你的意思是使用范围
53.weeks.ago.一天的开始..53.weeks.ago.一天的结束
?还有,为什么不使用(1.year.ago-1.weeks)。开始日期…(1.year.ago-1.weeks)。结束日期
?它将让Rails处理今年(以及2月28日和29日,然后“增加”一周)的事务,这要感谢Yoshiji先生。你能把这个添加到一个答案中吗?由于某种原因,我得到的1.year.ago-1.weeks
和53.weeks.ago
的日期不同,这是因为一年并不完全等于52周(52*7=364天,这里缺少一天!)。我在接下来的几分钟内发布了一个答案,这是完美的组合!谢谢你的这些方法,我不知道@Stefan再次做出了很好的回应,你能推荐一种聪明的方法来测试这个范围吗?我只测试一些标准日期和所有边缘情况,即每月的第一天和最后一天,2月29日和闰年。
Time.now.advance(years: -1, weeks: -1).all_day
#=> 2013-10-08 00:00:00 +0200..2013-10-08 23:59:59 +0200