Как я могу найти даты для той же недели год назад? - PullRequest
4 голосов
/ 02 декабря 2010

Это пример недели, с воскресенья по субботу:

11/21/2010 - 11/27/2010

Я бы хотел найти даты для той же недели воскресенье-суббота, только для прошлого года.

Ответы [ 4 ]

4 голосов
/ 02 декабря 2010
>> 1.year.ago.beginning_of_week.to_date
Mon, 30 Nov 2009
>> 1.year.ago.end_of_week.to_date
Sun, 06 Dec 2009
4 голосов
/ 02 декабря 2010
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
3 голосов
/ 02 декабря 2010
require 'chronic'
Chronic.parse '1 year ago'
# => 2009-12-01 14:05:39 -0800

Хронический - довольно приятный рубиновый камень, который может работать с различными вещами, в том числе адаптированными для вашего конкретного запроса.

1 голос
/ 02 декабря 2010

Попробуйте это:

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

ActiveSupport был на самом деле разделен на более тонкую гранулярность с Rails 3, поэтому вам не нужно загружать весь пакет, если вы этого не хотите. Я сделал это для простоты. Более подробная информация находится на странице Основные расширения ActiveSupport .

Или, вы можете получить 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, и для такого рода синтаксического анализа я думаю, что это правильное решение, потому что строка - это то, что вы создаете, а не пользователь, так что меньше шансов, что ваш код будет взорван непарсируемой строкой. Я не уверен, что из-за синтаксического анализа произошел скачок скорости, поэтому некоторые тесты могли бы быть в порядке, если бы анализ был в цикле.

...