web-dev-qa-db-fra.com

Obtenez le dernier jour du mois en rubis

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)?

47
sanny Sin

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
91
Mp de la Vega

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.

58
Thomas Klemm
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

0
Ali Akbar

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

0
akostadinov