提问人:Rubioli 提问时间:1/2/2023 更新时间:1/3/2023 访问量:124
Ruby - 从捐赠日期获取过去 x 个月
Ruby - Get the past x months from a giving date
问:
我怎样才能从捐赠日期获得过去的 x 个月?
例如,如果日期是 2023-01-04,而我想要过去 3 个月(包括当前日期),它会给我一个:array
[
'2023-01-01',
'2022-12-01',
'2022-11-01'
]
我试过:
current_month = Date.today.month
3.downto(1).map { |n| Date.parse(DateTime::MONTHNAMES.drop(1)[(current_month - n) % 12]).strftime('%Y-%m-%d') }
当一年没有结束时,它工作得很好,它只给出了该捐赠年份和新年的月份,它输出了完全错误的日期。
PS:我已经看到了一些解决方案,但没有任何效果
答:
7赞
Beartech
1/2/2023
#1
你可以使用像 和 Rails 这样的方法,可以很容易地处理简单的日期数学:beginning_of_month
编辑:使用 OP 的原始形式:
2.downto(0).map {|i| Date.today.beginning_of_month - (i).months}
正如 tadman 所指出的,这更干净。他们只需要在代码的其他地方将“我想要三个月”= 3 - 1 的逻辑转换到 0。
my_dates = (1..3).map {|i| Date.today.beginning_of_month - (i - 1).months}
#=> [Sun, 01 Jan 2023, Thu, 01 Dec 2022, Tue, 01 Nov 2022]
该输出看起来很奇怪,因为控制台显示的是日期对象,因此它们的颜色应该与方括号和日期之间的逗号不同。
评论
1赞
tadman
1/2/2023
我大部分时间都和你在一起,但使用 1..3 范围然后偏移 1 似乎毫无意义。为什么不是 0..2,或者换句话说,?3.times
1赞
Beartech
1/2/2023
我只是把 OP 的 1..3 数据当作我不能惹的东西。如果他们想先进行这种转变,那就太好了。但这完全需要他们给我的输入并给出正确的输出。
0赞
Beartech
1/2/2023
他们可以替换任何形式的 1...3 或 3...1 或 3.downto(1) 或使用 2..0 或 2.downto(0)。
0赞
tadman
1/2/2023
公平地说,当这样表达时,它看起来不合适。
1赞
Beartech
1/2/2023
哎呀!我使用了很多其他地方的形式,直到我重新阅读您的评论,我才想到这一点。甚至更好。#.times
2赞
Cary Swoveland
1/2/2023
#2
这仅仅体现了@steenslag对这个问题的评论。
require 'date'
def prev_dates(date_str, nbr_months)
first_date = DateTime.strptime(date_str[0,7], '%Y-%m')
nbr_months.times.with_object([]) do |i,arr|
arr << (first_date << i).strftime('%Y-%m-%d')
end
end
prev_dates('2023-01-04', 3)
#=>["2023-01-01", "2022-12-01", "2022-11-01"]
prev_dates('2023-01-04', 1)
#=> ["2023-01-01", "2022-12-01", "2022-11-01"]
评论
前进
,它可以在任何任意的时间段内向前滚动(或向后滚动,它只是负值)。advance
advance(months: -1)
等。我相信你可以从那里把它放在一起。请考虑:并使用 .3.times.map do |n|
n
Date.today << 1
将减去一个月。(这是普通的 Ruby)。