J'ai créé un nouvel objet Date.new avec args (année, mois). Après la création, Ruby a ajouté 01 jour à cet objet par défaut. Existe-t-il un moyen d’ajouter non pas le premier jour, mais le dernier jour du mois que j’ai passé comme argument (par exemple, 28 si il sera 02 mois ou 31 si il est 01 mois)?
utiliser Date.civil
Avec Date.civil(y, m, d)
ou son alias .new(y, m, d)
, vous pouvez créer un nouvel objet Date. Les valeurs pour le jour (j) et le mois (m) peuvent être négatives, auquel cas elles sont comptées à rebours depuis la fin de l'année et la fin du mois, respectivement.
=> Date.civil(2010, 02, -1)
=> Sun, 28 Feb 2010
>> Date.civil(2010, -1, -5)
=> Mon, 27 Dec 2010
Pour obtenir la fin du mois, vous pouvez également utiliser l'assistant end_of_month
d'ActiveSupport.
# Require extensions explicitly if you are not in a Rails environment
require 'active_support/core_ext'
p Time.now.utc.end_of_month # => 2013-01-31 23:59:59 UTC
p Date.today.end_of_month # => Thu, 31 Jan 2013
Vous pouvez en savoir plus sur end_of_month dans la documentation de l'API Rails.
require "date"
def find_last_day_of_month(_date)
if(_date.instance_of? String)
@end_of_the_month = Date.parse(_date.next_month.strftime("%Y-%m-01")) - 1
else if(_date.instance_of? Date)
@end_of_the_month = _date.next_month.strftime("%Y-%m-01") - 1
end
return @end_of_the_month
end
find_last_day_of_month("2018-01-01")
Ceci est une autre façon de trouver
Ceci est ma solution basée sur Time
. J'ai une préférence personnelle par rapport à Date
bien que les solutions Date
proposées ci-dessus se lisent mieux.
reference_time ||= Time.now
return (Time.new(reference_time.year, reference_time.month + 1) - 1).day