Ruby добавляет календарный месяц

#ruby #date

#ruby #Дата

Вопрос:

Я новичок в ruby, и у меня проблема с некоторыми функциями даты. Я пытаюсь добавить календарный месяц к указанной дате, чтобы «30 апреля 2002» выводило «31 мая 2002». Вот мой код

  date = '30th Apr 2002'
 parseDate = Date.parse(date)

(parseDate >> 1) # This returns 2002-05-30
  

Возможно, функция должна работать не так, и в этом случае мне нужно будет написать некоторый код для возврата последнего дня следующего месяца, если указанная дата является последним днем месяца?

Любая помощь будет оценена с благодарностью.

Комментарии:

1. Итак, к чему вам нужно добавить месяц, чтобы получить 30 мая 2002 года? Если бы меня попросили указать дату через один календарный месяц после 30 апреля, я бы сказал, 30 мая…

2. Да, это логика, которую я ожидал бы, однако в моих требованиях указано, что электронное письмо с напоминанием должно быть отправлено за один календарный месяц до установленной даты. Если срок выполнения — 31 мая, электронное письмо с напоминанием должно быть отправлено 30 апреля

3. Так что это не добавление календарного месяца — это вычитание календарного месяца, что совсем другое.

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

5. Что для вас значит «один календарный месяц»? 28 дней? 30 дней? 31 день?

Ответ №1:

>> просто увеличивает месяц и сохраняет один и тот же день в течение месяца, что, как отметил Скит в комментарии, несколько разумно…

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

 ((parseDate  1) >> 1) - 1
  

Для вычитания месяцев, как это видно из комментариев, которые вы действительно хотите, используйте тот же трюк, но оператор обратного месяца.

 ((parseDate  1) << 1) - 1
  

Комментарии:

1. Будет ли это работать только в крайнем случае, который я предоставил? Или со всеми месяцами? Спасибо

2. Да, в случае, который вы указали, как я подтвердил в irb. Я не вижу причин, по которым это вообще не сработало бы.

3. не будет работать в феврале, так как 28-е или 29-е 1 не перенесет его на следующий месяц — остальные месяцы должны работать нормально.

Ответ №2:

с activesupport

 parseDate = parseDate   1.month.since(parseDate)
  

или ровно 30 дней, так что это может немного проскользнуть

 parseDate = parseDate   (30*24*60*60)
  

Комментарии:

1. Привет, я думаю, возможно, мой вопрос не был на 100% ясен. Джон Скит помог мне, в любом случае спасибо за вашу помощь. Спасибо