Как получить первый день следующего месяца в рубине?
У меня есть дата операции. Я хочу создать долговые обязательства, которые получили:
day=1
month= the next month of operation_date
year= automatic
Пример:
operation_date = 15/11/2010
promissory_note1_date = 1/12/2010
promissory_note2_date = 1/01/2011
promissory_note3_date = 1/02/2011
promissory_note4_date = 1/02/2011
если существуют четыре векселя
Как я могу это сделать?
PD: Извините, мой синтаксис
Ответы
Ответ 1
Вы можете сделать
require "active_support"
Date.today.at_beginning_of_month
#=> Wed, 01 Dec 2010
Date.today.at_beginning_of_month.next_month
#=> Sat, 01 Jan 2011
Date.today.at_beginning_of_month.next_month.next_month
#=> Tue, 01 Feb 2011
И так далее...
Ответ 2
Я использую Ruby 1.8.7
и 1.9.2
с rvm
, и в обоих случаях Date.today
возникает ошибка:
ruby-1.8.7-p302 > Date.today
NameError: uninitialized constant Date
ruby-1.9.2-p0 > Date.today
NameError: uninitialized constant Object::Date
Мне нужно использовать Time.now
и эта ссылка должна помочь вам http://pleac.sourceforge.net/pleac_ruby/datesandtimes.html.
Я не уверен в доступности метода at_beginning_of_month
в ruby, но он существует в RoR.
Ответ 3
Мое решение:
class Time
def start_of_next_month
Time.local(self.year + self.month / 12, self.month % 12 + 1)
end
end
Ответ 4
Общий ответ за N месяцев
(Date.today + N.months).at_beginning_of_month
Ответ 5
для тех, кто работает с классом Time:
class Time
def start_of_next_month
t = Time.local(self.year,self.month)+45*24*3600;
Time.local(t.year,t.month)
end
end
Я знаю, это немного неуклюжие:)
Ответ 6
Я хотел получить первый понедельник года (для крепления рельсов), и следующее:
Date.new(Date.today.year,1,1).beginning_of_week
Если вы не находитесь в рельсах, это может быть как ниже,
# get the last day of the previous year
d = Date.new(Date.today.year - 1,12,31)
# advance to the next monday. This relies on w.day being 0..6, where 0 is sunday.
first_monday = d + (8 - d.wday).days
Ответ 7
Если вы не используете rails
или не хотите требовать active_support
, я нашел более простой способ без active_support
(Date.today - Date.today.mday + 1) # First day of the current month
=> Thu, 01 Dec 2016
Надеюсь, это поможет!: -)
Ответ 8
ActiveSupport кажется немного тяжеловесным для загрузки для этого. Я бы сделал это следующим образом:
require 'date'
first = Date.new(Date.today.year, Date.today.month, 1)
4.times do |m|
puts "Promissory note due on #{first >> (m + 1)}"
end
Ответ 9
В ноябре 2017 года at_beginning_of_month
больше не поддерживается в последней версии. Вместо этого вы можете использовать beginning_of_month
.