#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% ясен. Джон Скит помог мне, в любом случае спасибо за вашу помощь. Спасибо