如何获得Ruby中给定月份的天数,占年份?

我敢肯定,Ruby中有一个简单而优雅的单行程序,可以给你一个特定月份的天数,例如“1997年2月”。 它是什么?

这是从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 

如果你在Rails中工作,那么如果你在TimeDateDateTime之间进行切换,特别是在处理UTC /时区,夏令时等Time ,最终可能会受到阻碍。 我的经验是最好使用Time ,并坚持到处。

所以,假设你使用Rails的Time类,有两个很好的select,取决于上下文:

  1. 如果你有一个月和年,在Time上使用类方法:

     days = Time.days_in_month(m, y) 
  2. 如果你有一个时间对象t ,清理器可以询问当月最后一天的date编号:

     days = t.end_of_month.day 
 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) 

怎么样:

 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 。

在当前date的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的实例

 Time.at(seconds).end_of_month.day 

使用Time.days_in_month(month)month = 1月份, 2月份2月份等。

修改其他格式的input

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

至于钢轨3.2 …有一个内置版本: http : //api.rubyonrails.org/classes/Time.html#method-c-days_in_month

(唉,这个答案出现后,需要长时间的徒步旅行)

Time.now.end_of_month.day – 当前月份

Date.parse("2014-07-01").end_of_month.day – 使用月份中的第一天的date。

取决于ActiveSupport

我认为这是最简单的方法

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

使用Date的简单方法:

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