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

时间:2009-09-28 23:18:12

标签: ruby date

我确信在Ruby中有一个很好的简单优雅的单行程,可以给你一个月的天数,占一年,例如“1997年2月”。它是什么?

13 个答案:

答案 0 :(得分:124)

如果您在Rails工作,如果您在TimeDateDateTime之间切换,最终可能会陷入困境,尤其是在处理UTC时/时区,夏令时等。我的经验是最好使用Time,并坚持使用它。

因此,假设您正在使用Rails的Time类,根据上下文,有两个不错的选项:

  1. 如果您有一个月m和一年y,请使用Time上的类方法:

    days = Time.days_in_month(m, y)
    
  2. 如果您有时间对象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