You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于服务年限的年假天数计算实现求助(附服务年限计算代码)

基于服务年限计算年假天数的Ruby实现方案

没问题,我来帮你把这个年假匹配的逻辑用if语句实现出来~首先先明确咱们的规则边界:

  • 服务满1年但不满3年:15天年假
  • 服务满3年但不满5年:17天年假
  • 服务满5年但不满10年:20天年假
  • 服务满10年及以上:25天年假

首先我先帮你优化一下原有的year_of_service方法——里面定义的years数组没被用到,属于冗余代码,我给去掉了,同时把HTML转义的符号(>、&&)换回Ruby原生的运算符,让代码更易读:

def year_of_service(date_of_hired)
  now = Time.now.utc.to_date
  # 先计算年份差
  service_years = now.year - date_of_hired.year
  # 如果当前的月日还没到入职当天的月日,说明还没满整一年,要减1
  service_years -= 1 if now.month < date_of_hired.month || (now.month == date_of_hired.month && now.day < date_of_hired.day)
  service_years
end

接下来,咱们基于这个方法,用if-elsif-else结构实现年假天数的匹配逻辑,写成一个独立的方法:

def annual_leave_days(date_of_hired)
  service_years = year_of_service(date_of_hired)
  
  # 从最高年限往下判断,逻辑更简洁
  if service_years >= 10
    25
  elsif service_years >= 5
    20
  elsif service_years >= 3
    17
  elsif service_years >= 1
    15
  else
    # 服务不满1年的情况,可根据公司实际规则调整,这里默认返回0
    0
  end
end

代码说明:

  1. 判断顺序:从最高年限(10年及以上)开始判断,这样只要满足高年限条件就会直接返回结果,不用再执行后续判断,逻辑更高效。
  2. 边界处理:刚好满3年、5年、10年的员工会自动匹配到对应的年假天数,完全符合你给出的规则。
  3. 不满1年的情况:如果公司对不满1年的员工有其他年假规则(比如按比例折算),直接修改else分支的返回值即可。

测试示例:

你可以用以下代码测试不同入职时间的结果:

# 入职满10年(2013年5月1日)
puts annual_leave_days(Date.new(2013, 5, 1)) # 输出:25

# 入职满5年(2018年5月1日)
puts annual_leave_days(Date.new(2018, 5, 1)) # 输出:20

# 入职满3年(2020年5月1日)
puts annual_leave_days(Date.new(2020, 5, 1)) # 输出:17

# 入职满1年(2022年5月1日)
puts annual_leave_days(Date.new(2022, 5, 1)) # 输出:15

# 入职不满1年(2023年6月1日)
puts annual_leave_days(Date.new(2023, 6, 1)) # 输出:0

内容的提问来源于stack exchange,提问作者ImpostorIsAsking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:36:51