在Ruby中获取月中和月末日期

在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.

我正在尝试编写一个工资单程序,其中一种付款方式是每月两次(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.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,所以我创建了该方法来运行代码。我认为这对于无轨人群来说是值得一提的,因为我们的人数可能很少。