我怎样才能找到一年前同一周的日期?

时间:2010-12-01 21:45:13

标签: ruby datetime date

这是一周的例子,从星期日到星期六:

11/21/2010 - 11/27/2010

我想找到周日至周六同一周的日期,仅限去年。

4 个答案:

答案 0 :(得分:4)

require 'date' # Included in Ruby's standard library, no gem needed
now = Date.today
before = Date.civil( now.year-1, now.month, now.day )
sunday = Date.commercial( before.year, before.cweek, 1 ) - 1 # Day 1 is Monday
this_week_last_year = sunday..(sunday+6)

修改虽然Date.commercial很酷,但不需要。这是一个更简单的方法来查找本周开始的星期日:

require 'date'
now    = Date.today
before = Date.civil( now.year-1, now.month, now.day )
sunday = before - before.wday

答案 1 :(得分:4)

>> 1.year.ago.beginning_of_week.to_date
Mon, 30 Nov 2009
>> 1.year.ago.end_of_week.to_date
Sun, 06 Dec 2009

答案 2 :(得分:3)

require 'chronic'
Chronic.parse '1 year ago'
# => 2009-12-01 14:05:39 -0800

Chronic是一款非常甜美的rubygem,可以处理各种事物,包括根据您的特殊要求进行调整。

答案 3 :(得分:1)

试试这个:

require 'active_support/all'
today = Time.now #=> 2010-12-01 14:58:36 -0700
sunday = (today - today.wday.days).beginning_of_day #=> 2010-11-28 00:00:00 -0700
saturday = sunday + 6.days #=> 2010-12-04 00:00:00 -0700
sunday.wday #=> 0
saturday.wday #=> 6

sunday - 1.year #=> 2009-11-28 00:00:00 -0700
sunday.prev_year #=> 2009-11-28 00:00:00 -0700
saturday - 1.year #=> 2009-12-04 00:00:00 -0700
saturday.prev_year #=> 2009-12-04 00:00:00 -0700

您还可以计算两天中某一天的一周中的一周,然后减去365.days

使用Rails 3实际上将ActiveSupport拆分为更精细的粒度,因此如果您不想要,则无需加载整个套件。我这么做是为了简单。有关详情,请访问ActiveSupport Core Extensions page

或者,你可以通过字符串解析得到jiggy:

require 'chronic'
Chronic.parse('1 year ago last sunday') #=> 2009-11-28 12:00:00 -0700
Chronic.parse('1 year ago next saturday') #=> 2009-12-04 12:00:00 -0700

我喜欢Chronic,而且,对于这种解析,我认为这是一个很好的解决方案,因为字符串是你创建的,而不是用户,所以你的代码用不可解析的字符串炸毁的可能性更小。我不确定是否因为解析而受到速度的影响,所以如果解析将在一个循环中,那么一些基准测试可能是有序的。