2010-12-01 4 views

Répondre

1

Essayez ceci:

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 

Vous pouvez également comprendre la semaine de l'année pour l'un des deux jours, puis soustraire 365.days

ActiveSupport était en fait divisé en granularité plus fine avec Rails 3, donc vous n'avez pas à charger dans toute la suite si vous ne le voulez pas. Je l'ai fait pour la simplicité. Plus d'informations est sur le ActiveSupport Core Extensions page.

Ou, vous pourriez obtenir Jiggy avec l'analyse syntaxique de la chaîne:

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 

J'aime chronique, et, pour ce genre d'analyse syntaxique Je pense qu'il est une solution OK car la chaîne est quelque chose que vous voulez créer, et non un utilisateur, il y a donc moins de chances que votre code ne fasse exploser une chaîne impossible à analyser. Je ne suis pas sûr qu'il y ait un hit de vitesse à cause de l'analyse syntaxique, donc certains benchmarks pourraient être dans l'ordre si l'analyse devait être en boucle.

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

Chronic est un rubygem assez doux qui peut gérer une gamme de choses, y compris être adaptée à votre demande particulière.

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) 

Edit: Bien que Date.commercial est cool, il est pas nécessaire. Voici une façon plus simple de trouver le dimanche à partir de la semaine:

require 'date' 
now = Date.today 
before = Date.civil(now.year-1, now.month, now.day) 
sunday = before - before.wday 
3
>> 1.year.ago.beginning_of_week.to_date 
Mon, 30 Nov 2009 
>> 1.year.ago.end_of_week.to_date 
Sun, 06 Dec 2009 
Questions connexes