2009-09-28 12 views

Odpowiedz

20

Jest to realizacja od ActiveSupport (trochę dostosowany):

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 
+0

Btw, pierwotnie wprowadzone w module Czasu. –

+7

super przestarzały w tym momencie. spójrz na niektóre z pozostałych odpowiedzi. – drewish

+0

Jeśli używasz szyn, @mkosma ma prostszą odpowiedź. –

24

Jak o:

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) 

Można też spojrzeć na Time::days_in_month w Ruby on Rails.

+1

Czy możesz wyjaśnić, co to za def? Ponieważ lubię, ale chcę zrozumieć –

+1

@Mike Wade, to zakłada, że ​​wiemy, że grudzień ma 31 dni. A może nawet tego nie wiemy? – nemesisfixx

+4

Grudzień zawsze będzie miał 31 dni. –

111

Jeśli pracujesz w Rails, są szanse, dostaniesz hamstrung ostatecznie po przełączeniu między Time, Date i DateTime, zwłaszcza jeśli chodzi o czynienia ze strefami UTC/godzina, oszczędności światło dzienne, i tym podobne. Moje doświadczenie było najlepsze, aby używać Time i trzymać się go wszędzie.

Więc zakładając, że używasz klasy szynach czas, istnieją dwie dobre opcje, w zależności od kontekstu:

  1. Jeśli masz miesiąc m i rok y, należy użyć metody klasy na Time:

    days = Time.days_in_month(m, y) 
    
  2. Jeśli masz czas t obiekt, czystsze zapytać numer dnia ostatniego dnia miesiąca:

    days = t.end_of_month.day 
    
+4

To powinno być zaakceptowaną odpowiedzią naprawdę – dolzenko

+5

Dzięki! ale nie do końca - OP pytał o ruby, a nie o szyny. Chciałbym wiedzieć, ilu ludzi pracuje w Ruby Off Rails. – mkosma

+2

Ta odpowiedź naprawdę wydaje się "właściwym" sposobem na zrobienie tego! –

5

Zastosowanie Time.days_in_month(month) gdzie month = 1 do stycznia 2 dla lut itp

47
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) 
+8

To powinna być zaakceptowana odpowiedź. – steenslag

+0

btw Nie musiałem wymagać daty w programie "Tylko mój rubin". –

5

przeglądu wejście do innego formatu

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

Myślę, że to najprostszy sposób, aby to

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

Time.now.end_of_month.day - za bieżący miesiąc

Date.parse("2014-07-01").end_of_month.day - używać daty pierwszego dnia w miesiącu.

Zależy ActiveSupport

projekt
+0

Można również zrobić "Date.today.end_of_month.day" – 8bithero

8

w szynach dla bieżącej daty

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

Dla dowolnej daty t który jest instancją Czas

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

lub

t.end_of_month.day 

.
Jeśli masz UTC sekund, trzeba uzyskać instancję raz pierwszy

Time.at(seconds).end_of_month.day 
1

Prostym sposobem korzystania Date:

def days_of_month(month, year) 
    Date.new(year, month, -1).day 
end 
Powiązane problemy