получить следующий / предыдущий месяц от объекта Time - PullRequest
31 голосов
/ 23 апреля 2010

У меня есть объект Time, и я хотел бы найти следующий / предыдущий месяц. Добавление дней вычитания не работает, так как количество дней в месяце меняется.

time = Time.parse('21-12-2008 10:51 UTC')
next_month = time + 31 * 24 * 60 * 60

Увеличение месяца также падает, так как нужно было бы позаботиться о переходе

time = Time.parse('21-12-2008 10:51 UTC')
next_month = Time.utc(time.year, time.month+1)

time = Time.parse('01-12-2008 10:51 UTC')
previous_month = Time.utc(time.year, time.month-1)

Единственное, что я нашел на работе, было

time = Time.parse('21-12-2008 10:51 UTC')
d = Date.new(time.year, time.month, time.day)
d >>= 1
next_month = Time.utc(d.year, d.month, d.day, time.hour, time.min, time.sec, time.usec)

Есть ли более элегантный способ сделать это, чего я не вижу? Как бы вы это сделали?

Ответы [ 12 ]

0 голосов
/ 18 февраля 2015

Я использую ActiveSupport :: TimeZone для этого примера, но на всякий случай, если вы используете Rails или ActiveSupport, это может пригодиться.

Если вы хотите предыдущий месяц, вы можетевычитать 1 месяц

time = Time.zone.parse('21-12-2008 10:51 UTC')
time.ago(1.month)
0 голосов
/ 03 февраля 2015

Некоторые решения предполагают рельсы. Но в чистом рубине вы можете сделать следующее

require 'date'    

d = Date.now
last_month = d<<1

last_month.strftime("%Y-%m-%d")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...