2009-09-28 34 views

Trả lời

20

này là việc thực hiện từ ActiveSupport (một chút điều chỉnh):

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, ban đầu thực hiện trong mô-đun Time. –

+7

siêu ngày tại thời điểm này. nhìn vào một số câu trả lời khác. – drewish

+0

Nếu bạn đang sử dụng đường ray, @mkosma có câu trả lời đơn giản hơn. –

24

Làm thế nào về:

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) 

Bạn cũng có thể muốn xem xét Time::days_in_month trong Ruby on Rails.

+1

Bạn có thể giải thích những gì làm cho def này? Bởi vì tôi thích nhưng tôi muốn hiểu –

+1

@Mike Wade, điều này giả định rằng chúng tôi biết tháng 12 có 31 ngày. Còn nếu chúng ta thậm chí không biết điều đó? – nemesisfixx

+4

Tháng 12 sẽ luôn có 31 ngày. –

111

Nếu bạn đang làm việc trong Rails, rất có thể bạn sẽ nhận được hamstrung cuối cùng nếu bạn chuyển đổi giữa các Time, Date, và DateTime, đặc biệt là khi nói đến giao dịch với khu UTC/thời gian, tiết kiệm ánh sáng ban ngày, và những thứ tương tự. Kinh nghiệm của tôi là tốt nhất để sử dụng Time và gắn bó với nó ở mọi nơi.

Vì vậy, giả sử bạn đang sử dụng lớp Time Rails, có hai lựa chọn tốt, tùy thuộc vào bối cảnh:

  1. Nếu bạn có một tháng m và năm y, sử dụng phương thức lớp trên Time:

    days = Time.days_in_month(m, y) 
    
  2. Nếu bạn có một đối tượng Time t, sạch hơn để hỏi số ngày của ngày cuối cùng của tháng:

    days = t.end_of_month.day 
    
+4

Đây phải là câu trả lời được chấp nhận thực sự – dolzenko

+5

Cảm ơn! nhưng không thực sự - OP hỏi về ruby, chứ không phải đường ray. Tôi muốn được biết có bao nhiêu người đang làm việc trong Ruby Off Rails. – mkosma

+2

Câu trả lời này thực sự cảm thấy giống như cách 'đúng' để làm điều đó! –

5

Sử dụng Time.days_in_month(month) nơi month = 1 cho tháng Một, 2 cho tháng hai, vv

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

Đây phải là câu trả lời được chấp nhận. – steenslag

+0

btw Tôi không cần yêu cầu Ngày trong chương trình chỉ có ruby ​​của tôi. –

5

điều chỉnh lại các đầu vào cho định dạng khác

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

Tôi nghĩ rằng đó là cách đơn giản nhất để có được nó

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

Time.now.end_of_month.day - cho tháng hiện tại

Date.parse("2014-07-01").end_of_month.day - sử dụng ngày đầu tiên trong tháng.

Phụ thuộc vào ActiveSupport

+0

Bạn cũng có thể thực hiện 'Date.today.end_of_month.day' – 8bithero

8

Trong Rails dự án cho ngày hiện tại

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

Đối ngày bất kỳ t đó là thể hiện của Time

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

hoặc

t.end_of_month.day 

.
Nếu bạn có UTC giây, bạn cần phải nhận được một thể hiện của Time đầu tiên

Time.at(seconds).end_of_month.day 
1

Một cách đơn giản sử dụng Date:

def days_of_month(month, year) 
    Date.new(year, month, -1).day 
end 
Các vấn đề liên quan