我正在编写一个通过日期范围跟踪休假的应用,我的部分计算确保排除周末和假日。为了跟踪假期,我正在使用假日宝石(https://github.com/alexdunae/holidays)的分叉版本,对其进行编辑以识别我公司认可的假期。我的前叉:( https://github.com/rclark4/holidays)。
到目前为止,一切对我来说都很好,但是在感恩节后的第二天我遇到了一个问题,这是对原始宝石的补充。这是YAML文件的摘录:
11:
- name: Thanksgiving
week: 4
regions: [us]
wday: 4
- name: Day after Thanksgiving
week: 4
regions: [us]
wday: 5
虽然这在2008年至2012年期间有效,但这在2013年不会起作用(并且不会每6到7年一次),因为这个11月在星期五开始,所以现在它说的是感恩节后的第二天是它实际上是一周。我试着看看所有其他假期的语法,看看是否有一个假期发生在浮动假期后的一天,但我找不到一个(我发现最接近的是耶稣受难节到复活节) ,但复活节有它自己独立的方法)。关于如何为此编写函数的任何想法?
如果您需要更多信息,请与我们联系!
答案 0 :(得分:2)
感恩节是11月的第4个星期四,所以第二天是+1。 Date.calculate_mday由假日宝石添加。
lib / holidays.rb中的
def self.day_after_thanksgiving(year)
Date.civil(year,11,Date.calculate_mday(year,11,:fourth,:thursday)+1)
end
data / us.yaml中的将假期更改为:
- name: Day after Thanksgiving
function: day_after_thanksgiving(year)
regions: [us]
确保您已安装珠宝商
rake defs:build_all
然后运行测试:[test_full_week已经破了]
rake
然后重建你的宝石。
注意: 将感恩节定义为方法可能更有意义,然后在yaml文件中使用函数进行定义,并在星期五之后使用感恩节+ 1。
答案 1 :(得分:2)
Shawn的回答大多是正确的,但实际上你应该在原始文件中放置特定于区域的方法。这个想法是,你不应该触摸.rb文件来制作新的定义,只需要.yaml文件。 lib / holidays.rb实际上适用于通用代码规则(如to_weekday_if_weekend等),而不适用于特定于某个区域的规则。我知道,即使你没有完全遵守规则,它仍然有用,但即将发布的新版本(希望如今)将很快改变。
所以在us.yaml 11月应该是:
11:
- name: Thanksgiving
week: 4
regions: [us]
wday: 4
- name: Day after Thanksgiving
function: day_after_thanksgiving(year)
regions: [us]
并且在同一文件中的方法(其中定义了us_inauguration_day,至少在主版本中)应该是:
methods:
us_inauguration_day: |
# January 20, every fourth year, following Presidential election
def self.us_inauguration_day(year)
year % 4 == 1 ? 20 : nil
end
day_after_thanksgiving: |
def self.day_after_thanksgiving(year)
Date.civil(year,11,Date.calculate_mday(year,11,:fourth,:thursday)+1)
end
然后运行rake defs:build_all(在添加新的区域文件时运行rake defs:manifest) 我把你的副本与你的测试相匹配,但作为参考:
tests: |
{ Date.civil(2008,11,27) => 'Thanksgiving',
Date.civil(2008,11,28) => 'Day after Thanksgiving'}.each do |date, name|
assert_equal name, (Holidays.on(date, :us)[0] || {})[:name]
end