web-dev-qa-db-fra.com

Comment obtenir le nombre de jours d'un mois donné en Ruby, en tenant compte de l'année?

Je suis sûr qu’il existe une ligne simple et élégante en Ruby qui vous donne le nombre de jours d’un mois donné, par année, comme "février 1997". Qu'Est-ce que c'est?

47
Teflon Ted

Voici l'implémentation de ActiveSupport (un peu adapté):

COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def days_in_month(month, year = Time.now.year)
   return 29 if month == 2 && Date.gregorian_leap?(year)
   COMMON_YEAR_DAYS_IN_MONTH[month]
end
23
andre-r

Si vous travaillez dans Rails, il est fort probable que vous finissiez par être bloqué si vous passez de Time, Date et DateTime, en particulier en ce qui concerne le traitement des fuseaux horaires, des fuseaux horaires, de l'heure d'été, etc. Selon mon expérience, il est préférable d’utiliser Time et de l’utiliser partout. 

Donc, si vous utilisez la classe Time de Rails, il existe deux bonnes options, selon le contexte:

  1. Si vous avez un mois m et une année y, utilisez la méthode de classe sur Time:

    days = Time.days_in_month(m, y)
    
  2. Si vous avez un objet Time t, nettoyeur pour demander le numéro du jour du dernier jour du mois:

    days = t.end_of_month.day
    
122
mkosma
require 'date'

def days_in_month(year, month)
  Date.new(year, month, -1).day
end

# print number of days in February 2012
puts days_in_month(2012, 2)
59
crantok

Que diriez-vous:

require 'date'

def days_in_month(year, month)
  (Date.new(year, 12, 31) << (12-month)).day
end

# print number of days in Feburary 2009
puts days_in_month(2009, 2)

Vous pouvez également vouloir regarder Time :: days_in_month dans Ruby on Rails.

24
user180804

Projet Rails pour la date du jour

Time.days_in_month(Time.now.month, Time.now.year)

Pour toute date t qui est une instance de Time

Time.days_in_month(t.month, t.year)

ou

t.end_of_month.day

.
Si vous avez UTC secondes , vous devez d'abord obtenir une instance de Time.

Time.at(seconds).end_of_month.day
9
Serge Seletskyy

réviser l'entrée pour un autre format

def days_in_a_month(date = "2012-02-01")
  date.to_date.end_of_month.day
end
5
Mr Bohr

Utilisez Time.days_in_month(month)month = 1 pour janvier, 2 pour février, etc.

5
Henley Chiu

Time.now.end_of_month.day - pour le mois en cours

Date.parse("2014-07-01").end_of_month.day - utilise la date du premier jour du mois.

Dépend d'ActiveSupport

3
Piotr Karbownik

à partir de Rails 3.2 ... il existe une version intégrée: http://api.rubyonrails.org/classes/Time.html#method-c-days_in_month

(hélas, il apparaît après cette réponse, ce qui oblige les gens à faire une longue randonnée)

3
aabes

Un moyen simple en utilisant Date:

def days_of_month(month, year)
  Date.new(year, month, -1).day
end
1
Alex

Pour un objet Date donné, je pense que le plus simple est:

Date.today.all_month.count
1
pierrea

Comme l’heure n’est pas pertinente à cette fin, vous avez simplement besoin d’un objet de date:

[*Date.today.all_month].size
1
Andres Leon

Je pense que c'est le moyen le plus simple de l'obtenir

def get_number_of_days(date = Date.today)
  Date.new(date.year, date.month, -1).mday
end
1
alek