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

Tef*_*Ted 52 ruby date

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

mko*_*sma 125

如果你在Rails工作,如果你在和之间切换Time,你最终会陷入困境,特别是在处理UTC /时区,夏令时等时.我的经验是最好的使用,并坚持到处都是. DateDateTimeTime

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

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

    days = Time.days_in_month(m, y)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您有Time对象t,请更清楚地询问当月最后一天的日期编号:

    days = t.end_of_month.day
    
    Run Code Online (Sandbox Code Playgroud)

  • 我在轨道外面使用红宝石,这个答案对我没有好处. (13认同)
  • 谢谢!但不是真的 - OP询问红宝石,而不是铁轨.我很想知道有多少人在Ruby Off Rails工作. (7认同)
  • 这个答案真的像'正确'的方式! (2认同)
  • 我正在需要的地方实现一个 gem,并且我不能假设用户会在 Rails 中使用该 gem。所以我真的认为,虽然更干净,但这不应该是公认的答案。很高兴在上下文中也能看到它,因为很多人在 Rails 中更喜欢这个选项。 (2认同)

cra*_*tok 64

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)
Run Code Online (Sandbox Code Playgroud)

  • 您只需要不需要日期,因为其他地方已经需要它了。 (2认同)

and*_*e-r 25

这是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
Run Code Online (Sandbox Code Playgroud)

  • 在这一点上超级过时了.看看其他一些答案. (8认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

您可能还想查看Ruby on Rails中的Time :: days_in_month.

  • 12月总是有31天. (4认同)
  • `&lt;&lt; (12-month)).day` 似乎不太可读/可理解/可维护,而 `year,month,-1` 似乎更明显 - 对我来说。 (3认同)

Ser*_*kyy 10

在当前日期的Rails项目中

Time.days_in_month(Time.now.month, Time.now.year)
Run Code Online (Sandbox Code Playgroud)

对于作为时间实例的任何日期t

Time.days_in_month(t.month, t.year)
Run Code Online (Sandbox Code Playgroud)

要么

t.end_of_month.day
Run Code Online (Sandbox Code Playgroud)

.
如果您有UTC ,则需要先获取时间实例

Time.at(seconds).end_of_month.day
Run Code Online (Sandbox Code Playgroud)


pie*_*rea 9

对于给定的 Date 对象,我觉得最简单的是:

Date.today.all_month.count
Run Code Online (Sandbox Code Playgroud)


Hen*_*hiu 5

使用Time.days_in_month(month)其中month = 1一月份,2为二月,等等.


小智 5

修改其他格式的输入

def days_in_a_month(date = "2012-02-01")
  date.to_date.end_of_month.day
end
Run Code Online (Sandbox Code Playgroud)