Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 一年零一周时间范围_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 一年零一周时间范围

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会更好,因为它实际上更改了

我正试图通知我的客户他们的订阅即将到期。这就是我希望那些用户通知他们的方式。他们将在认购日期+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
会更好,因为它实际上更改了日期时间的
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