【问题标题】:How to build a monthly range that takes in account the number of days of each month?如何建立一个考虑每个月天数的月度范围?
【发布时间】:2019-10-23 17:02:07
【问题描述】:

我有一个带有start_dateend_date 的范围,我想在整个范围内获得每个月的同一天,所以从 1 月 30 日开始,我应该得到每个月的 30 日:

start_date = Date.new(2019, 1, 30)
end_date = Date.new(2019, 12, 30)

range = (start_date...end_date)
dates = range.step(30).map(&:to_date)

dates
#=> [Wed, 30 Jan 2019,
#    Fri, 01 Mar 2019,
#    Sun, 31 Mar 2019,
#    Tue, 30 Apr 2019,
#    Thu, 30 May 2019,
#    Sat, 29 Jun 2019,
#    Mon, 29 Jul 2019,
#    Wed, 28 Aug 2019,
#    Fri, 27 Sep 2019,
#    Sun, 27 Oct 2019,
#    Tue, 26 Nov 2019,
#    Thu, 26 Dec 2019]

我在weeks 中使用了类似的东西,但是例如到了 2 月的几个月,它当然会失败,所以我必须调整到 28 日。

我知道我可以循环查看月份并根据start_date 进行调整,但这感觉是个坏主意。

【问题讨论】:

  • 不幸的是,在您的示例中,30 既是月份中的日期,也是 step 的增量值。
  • 顺便说一句,这不仅仅是二月。请注意,大多数其他日期也已关闭。您不能通过添加 30 天来逐月移动,因为 12 个月中只有 4 个月正好有 30 天。

标签: ruby-on-rails ruby


【解决方案1】:

我认为您可以使用任一主动支持:

require 'active_support/time'
start_date = Date.parse('2019-10-31')
12.times.map { |i| start_date + i.month }

=> [
 Thu, 31 Oct 2019,
 Sat, 30 Nov 2019,
 Tue, 31 Dec 2019,
 Fri, 31 Jan 2020,
 Sat, 29 Feb 2020,
 Tue, 31 Mar 2020,
 Thu, 30 Apr 2020,
 Sun, 31 May 2020,
 Tue, 30 Jun 2020,
 Fri, 31 Jul 2020,
 Mon, 31 Aug 2020,
 Wed, 30 Sep 2020
]

或调整:#next_month:

require 'date'
Date.parse('2019-10-31').next_month # => Sat, 30 Nov 2019

【讨论】:

  • 这太完美了,谢谢!是的,我找到了.next_month,但在 2 月 28 日之后,它会在所有地方切换到 28。
  • 关于如何计算两个日期之间的月数有什么建议吗?我发现的“最佳”是使用30.4375 和计算范围的天数,这会产生精度问题。
  • 您可以调整这个 sn-p 的月数:date1 = Date.parse('2019-10-24'); date2 = Date.parse('2019-11-25'); (date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)。借自[在 Ruby on Rails 中查找两个日期之间的月数](stackoverflow.com/questions/9428605/…)
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多