在Ruby中获取月中和月末日期
我正在尝试编写一个工资单程序,其中一种付款方式是每月两次(15日、30日和/或31日)。我可以得到当月的付款日期,但我需要打印下一年的付款日期。到目前为止,我的代码是:在Ruby中获取月中和月末日期,ruby,date,Ruby,Date,我正在尝试编写一个工资单程序,其中一种付款方式是每月两次(15日、30日和/或31日)。我可以得到当月的付款日期,但我需要打印下一年的付款日期。到目前为止,我的代码是: require "active_support/core_ext" require 'date' def twice_a_month_payment_schedule middle_of_month = Date.today.at_end_of_month - 15 end_of_month = Date.today.
require "active_support/core_ext"
require 'date'
def twice_a_month_payment_schedule
middle_of_month = Date.today.at_end_of_month - 15
end_of_month = Date.today.at_end_of_month
one_year = Date.today.at_end_of_month + 365
starting_payment_date = Date.parse(start_date) ### start_date is an argument in the format of "%Y-%m-%d".
while starting_payment_date < one_year
if middle_of_month.saturday?
middle_of_month - 1
elsif middle_of_month.sunday?
middle_of_month - 2
elsif end_of_month.saturday?
end_of_month - 1
elsif end_of_month.sunday?
end_of_month - 2
end
starting_payment_date += 1
end
pay_dates << middle_of_month.strftime("%m-%d-%Y")
pay_dates << end_of_month.strftime("%m-%d-%Y")
pay_dates
end
需要“主动支持/核心扩展”
需要“日期”
def每月两次付款计划
月中=日期。今天。月底-15
月末=Date.day.at月末
一年=日期。今天。月底+365
开始付款日期=日期。parse(开始日期)####开始日期是“%Y-%m-%d”格式的参数。
开始付款日期<一年
如果月中旬,星期六?
月中旬-1
如果是月中旬,星期天?
月中旬-2
如果月底星期六?
月底-1
如果月底是星期天?
月底-2
结束
开始付款日期+=1
结束
支付日期为什么不概括助手以获取任何年/月的日期:
require "active_support/core_ext"
require 'date'
def twice_a_month_payment_schedule(year, month)
base = Date.new(year, month)
middle_of_month = 14.days.since(base)
end_of_month = base.at_end_of_month
if middle_of_month.saturday?
middle_of_month - 1
elsif middle_of_month.sunday?
middle_of_month - 2
elsif end_of_month.saturday?
end_of_month - 1
elsif end_of_month.sunday?
end_of_month - 2
end
[middle_of_month.strftime("%m-%d-%Y"), end_of_month.strftime("%m-%d-%Y")]
end
puts "Jan 2014: #{twice_a_month_payment_schedule(2014, 1)}"
puts "Mar 2014: #{twice_a_month_payment_schedule(2014, 3)}"
puts "Aug 2014: #{twice_a_month_payment_schedule(2014, 8)}"
puts "May 2015: #{twice_a_month_payment_schedule(2015, 5)}"
puts "Feb 2024: #{twice_a_month_payment_schedule(2024, 2)}"
puts "Dec 2135: #{twice_a_month_payment_schedule(2135, 12)}"
结果:
⚡️ ruby derp.rb
Jan 2014: ["01-15-2014", "01-31-2014"]
Mar 2014: ["03-15-2014", "03-31-2014"]
Aug 2014: ["08-15-2014", "08-31-2014"]
May 2015: ["05-15-2015", "05-31-2015"]
Feb 2024: ["02-15-2024", "02-29-2024"]
Dec 2135: ["12-15-2135", "12-31-2135"]
这是评论,不是回答。我想指出代码中的一个小问题,并建议如何更好地组织代码。我接受了@Nick的代码并做了一些更改
我知道你不希望发薪日落在周末。因此,不是:
if middle_of_month.saturday?
middle_of_month - 1
elsif middle_of_month.sunday?
middle_of_month - 2
elsif end_of_month.saturday?
end_of_month - 1
elsif end_of_month.sunday?
end_of_month - 2
end
你想要:
if middle_of_month.saturday?
middle_of_month - 1
elsif middle_of_month.sunday?
middle_of_month - 2
end
if end_of_month.saturday?
end_of_month - 1
elsif end_of_month.sunday?
end_of_month - 2
end
目前的情况是,如果两个发薪日最初都是在周末,那么只有月中的发薪日才会改变。通过此修改,每个发薪日的操作几乎相同,因此消除重复位是有意义的。以下是您可能的做法:
require "active_support/core_ext"
require 'date'
def twice_a_month_payment_schedule(year, month)
base = Date.new(year, month)
[check_and_format_payday(base+14),
check_and_format_payday(base.at_end_of_month)]
end
def check_and_format_payday(payday)
case
when payday.saturday?
payday -= 1
when payday.sunday?
payday -= 2
end
payday.strftime("%a %m-%d-%Y")
end
puts "Jan 2014: #{twice_a_month_payment_schedule(2014, 1)}"
# Jan 2014: ["Wed 01-15-2014", "Fri 01-31-2014"]
"Feb 2014: #{twice_a_month_payment_schedule(2014, 2)}"
# Feb 2014: ["Fri 02-14-2014", "Fri 02-28-2014"]
"Mar 2014: #{twice_a_month_payment_schedule(2014, 3)}"
# Mar 2014: ["Fri 03-14-2014", "Mon 03-31-2014"]
puts "Aug 2014: #{twice_a_month_payment_schedule(2014, 8)}"
# Aug 2014: ["Fri 08-15-2014", "Fri 08-29-2014"]
puts "May 2015: #{twice_a_month_payment_schedule(2015, 5)}"
# May 2015: ["Fri 05-15-2015", "Fri 05-29-2015"]
puts "Feb 2024: #{twice_a_month_payment_schedule(2024, 2)}"
# Feb 2024: ["Thu 02-15-2024", "Thu 02-29-2024"]
puts "Dec 2135: #{twice_a_month_payment_schedule(2135, 12)}"
# Dec 2135: ["Thu 12-15-2135", "Fri 12-30-2135"]
请注意,我稍微更改了输出格式以包括星期几
require "active_support/core_ext"
仅在月底的方法中需要。您也可以自己定义它:
class Date
def at_end_of_month
next_month - 1
end
end
啊,谢谢。我从来没想过。很好!再次感谢这是一个很好的建议,谢谢Cary。我从来没有想过要做一个课堂日期,但这很有意义,因为我多次引用了逻辑。class Date…end
在Ruby的Date
类中添加了一个月的方法。我不使用Rails,所以我创建了该方法来运行代码。我认为这对于无轨人群来说是值得一提的,因为我们的人数可能很少。