Как получить первый день следующего месяца в рубине? - PullRequest
46 голосов
/ 09 декабря 2010

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

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: Извините, мой синтаксис

Ответы [ 9 ]

146 голосов
/ 09 декабря 2010

Вы можете сделать

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

И так далее ...

10 голосов
/ 09 декабря 2016

Если вы не используете rails или не хотите требовать active_support, я нашел более простой способ без active_support

(Date.today - Date.today.mday + 1) # First day of the current month
=> Thu, 01 Dec 2016

Надеюсь, это поможет!: -)

7 голосов
/ 18 сентября 2014

Общий ответ за N месяцев

(Date.today + N.months).at_beginning_of_month
7 голосов
/ 09 декабря 2010

Я использую 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.

6 голосов
/ 20 апреля 2012

Мое решение:

class Time
  def start_of_next_month
    Time.local(self.year + self.month / 12, self.month % 12 + 1)
  end
end
4 голосов
/ 05 октября 2011

для тех, кто работает с классом 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

Я знаю, что это немного неуклюже:)

2 голосов
/ 28 апреля 2012

Я хотел получить первый понедельник в году (для крепления на рельсах), и сработало следующее:

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
1 голос
/ 10 ноября 2017

Начиная с ноября 2017 года, at_beginning_of_month больше не поддерживается в последней версии. Вместо этого вы можете использовать beginning_of_month, учитывая, что вы используете Rails

0 голосов
/ 05 декабря 2016

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...