我确信在Ruby中有一个很好的简单优雅的单行程,可以给你一个月的天数,占一年,例如“1997年2月”。它是什么?
答案 0 :(得分:124)
如果您在Rails工作,如果您在Time
,Date
和DateTime
之间切换,最终可能会陷入困境,尤其是在处理UTC时/时区,夏令时等。我的经验是最好使用Time
,并坚持使用它。
因此,假设您正在使用Rails的Time类,根据上下文,有两个不错的选项:
如果您有一个月m
和一年y
,请使用Time
上的类方法:
days = Time.days_in_month(m, y)
如果您有时间对象t
,请更清楚地询问当月最后一天的日期编号:
days = t.end_of_month.day
答案 1 :(得分:61)
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)
答案 2 :(得分:24)
怎么样:
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)
您可能还想查看Ruby on Rails中的Time::days_in_month。
答案 3 :(得分:23)
这是ActiveSupport的实现(稍微改编):
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
答案 4 :(得分:10)
在当前日期的Rails项目中
Time.days_in_month(Time.now.month, Time.now.year)
对于任何日期 t ,这是时间的实例
Time.days_in_month(t.month, t.year)
或
t.end_of_month.day
。
如果您有UTC 秒,则需要先获取时间实例
Time.at(seconds).end_of_month.day
答案 5 :(得分:5)
使用Time.days_in_month(month)
一月month = 1
,二月2
等等。
答案 6 :(得分:5)
修改其他格式的输入
def days_in_a_month(date = "2012-02-01")
date.to_date.end_of_month.day
end
答案 7 :(得分:3)
从rails 3.2开始......有一个内置版本: http://api.rubyonrails.org/classes/Time.html#method-c-days_in_month
(唉,它出现在这个答案之后,这让人们长途跋涉)
答案 8 :(得分:3)
Time.now.end_of_month.day
- 当月
Date.parse("2014-07-01").end_of_month.day
- 使用月中第一天的日期。
取决于ActiveSupport
答案 9 :(得分:2)
对于给定的Date对象,我觉得最简单的方法是:
Date.today.all_month.count
答案 10 :(得分:1)
我认为这是获得它的最简单方法
def get_number_of_days(date = Date.today)
Date.new(date.year, date.month, -1).mday
end
答案 11 :(得分:1)
使用Date
的简单方法:
def days_of_month(month, year)
Date.new(year, month, -1).day
end
答案 12 :(得分:1)
由于与时间无关,因此您只需要一个日期对象:
[*Date.today.all_month].size