如何获得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中工作,那么如果你在Time
, Date
和DateTime
之间进行切换,特别是在处理UTC /时区,夏令时等Time
,最终可能会受到阻碍。 我的经验是最好使用Time
,并坚持到处。
所以,假设你使用Rails的Time类,有两个很好的select,取决于上下文:
-
如果你有一个月和年,在
Time
上使用类方法:days = Time.days_in_month(m, y)
-
如果你有一个时间对象
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