it-swarm-eu.dev

Comment obtenir le premier jour du mois prochain en rubis?

J'ai une date d'opération. Je veux créer des billets à ordre qui ont:

day=1
month= the next month of operation_date
year= automatic

Exemple :

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

s'il existe quatre billets à ordre

Comment pourrais-je le faire?

PD: Excusez moi ma syntaxe

41
maxiperez

Tu peux faire

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

Etc...

138
jordinl

Si vous n'utilisez pas Rails ou ne souhaitez pas exiger active_support, j'ai trouvé un moyen plus simple sans active_support

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

J'espère que cela t'aides! :-)

8
Sagar Ranglani

Une réponse générique pour N mois

(Date.today + N.months).at_beginning_of_month
7
Jerome

J'utilise Ruby 1.8.7 et 1.9.2 avec rvm et dans les deux cas, Date.today génère une erreur:

Ruby-1.8.7-p302 > Date.today
NameError: uninitialized constant Date

Ruby-1.9.2-p0 > Date.today
NameError: uninitialized constant Object::Date

Je pense que vous devriez utiliser Time.now.__ et ce lien devrait vous aider http://pleac.sourceforge.net/pleac_Ruby/datesandtimes.html .

Je ne suis pas sûr de la disponibilité de la méthode at_beginning_of_month dans Ruby, mais elle existe dans RoR.

7
ranendra

Ma solution:

class Time
  def start_of_next_month
    Time.local(self.year + self.month / 12, self.month % 12 + 1)
  end
end
6
boggy

pour ceux qui travaillent avec la classe 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

Je sais que c'est un peu maladroit :)

4
boggy

Je voulais avoir le premier lundi de l'année (pour un montage Rails) et les choses suivantes ont fonctionné:

Date.new(Date.today.year,1,1).beginning_of_week

Si vous n'êtes pas dans Rails, cela peut être comme ci-dessous,

# 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
2
Shyam Habarakada

En novembre 2017, at_beginning_of_month n'est plus pris en charge dans la dernière version. Vous pouvez utiliser beginning_of_month à la place, en considérant que vous utilisez Rails

1
Adam Aiken

ActiveSupport semble un peu lourd à charger pour cela. Je le ferais de cette façon:

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 
0
Mark Reed