【问题标题】:Get the first Monday of every quarter in Rails在 Rails 中获取每个季度的第一个星期一
【发布时间】:2021-12-09 10:15:11
【问题描述】:

在 Ruby on Rails 中获得每个季度的第一个星期一最简洁的方法是什么?

我发现的解决方案对我来说看起来很糟糕: 检查今天是否是该月的前 7 天之一,然后检查今天是否是星期一,最后查看该月是否包含在该季度的 4 个月之一中。

我认为这应该是实现这一目标的更好方法。

【问题讨论】:

  • 任何季度或当前季度?
  • 我忘了提这个,一年中的每个季度,所以 [Jan, Apr, Jul, Oct]

标签: ruby-on-rails ruby date quarter


【解决方案1】:

这是一个纯 Ruby 解决方案。

def first_monday_by_quarter(year)
  [1, 4, 7, 10].map do |month|
    d = Date.new(year, month, 1)
    d.wday.zero? ? (d+1) : d+8-d.wday
  end
end
first_monday_by_quarter(2022)
  #=> [#<Date: 2022-01-03 ((2459583j,0s,0n),+0s,2299161j)>,
  #    #<Date: 2022-04-04 ((2459674j,0s,0n),+0s,2299161j)>,
  #    #<Date: 2022-07-04 ((2459765j,0s,0n),+0s,2299161j)>,
  #    #<Date: 2022-10-03 ((2459856j,0s,0n),+0s,2299161j)>]
first_monday_by_quarter(Date.today.year)
  #=> #<Date: 2021-01-04 ((2459219j,0s,0n),+0s,2299161j)>,
  #   #<Date: 2021-04-05 ((2459310j,0s,0n),+0s,2299161j)>,
  #   #<Date: 2021-07-05 ((2459401j,0s,0n),+0s,2299161j)>,
  #   #<Date: 2021-10-04 ((2459492j,0s,0n),+0s,2299161j)>]

如果需要,可以将Date.new(year, month, 1) 缩短为Date.new(year, month)。如果在纯 Ruby 代码中使用 require 'date',则需要它。

【讨论】:

    【解决方案2】:

    这是我的方法:

    first_day = Date.today.beginning_of_year
    mondays = 4.times.map do |i|
      first_day_of_quarter = first_day.advance(months: 3 * i).beginning_of_quarter
      first_day_of_quarter.monday? ? first_day_of_quarter : first_day_of_quarter.next_week
    end
    
    # [0] Mon, 04 Jan 2021,
    # [1] Mon, 05 Apr 2021,
    # [2] Mon, 05 Jul 2021,
    # [3] Mon, 04 Oct 2021
    

    【讨论】:

    • 不错的答案!读者:如果您对next_week 感到困惑,该方法接受的参数是星期几,默认为:monday
    • @Cary 老实说,我不认为这种方法存在。我只是调用了一种在我看来听起来不错的方法,我会命名的方法,令我惊讶的是它起作用了。然后我查了一下?。我喜欢 Ruby 中的一件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多