我正在写一个通过日期范围跟踪休假的应用程序,我的部分计算确保不包括周末和节假日。为了跟踪假日,我使用了一个分叉版本的holidays gem(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月是星期五,所以现在它说感恩节后的一天比实际感恩节早一周。我试图查看所有其他假日的语法,看看是否有浮动假日后第二天发生的假日的先例,但我找不到一个(我找到的最接近复活节的是耶稣受难节,但复活节完全有它自己的独立方法)。有没有关于如何为此编写函数的想法?
如果你需要更多的信息,请告诉我!
发布于 2013-05-17 01:51:29
Shawn的答案大部分是正确的,但实际上您应该将特定于区域的方法放在原始文件中。这个想法是,你不应该需要接触.rb文件来进行新的定义,只需要接触.yaml文件。lib/holidays.rb实际上是通用的代码规则(如to_weekday_if_weekend等),而不是特定于某个区域的规则。我知道,即使你不严格遵循规则,它也能工作,这有点令人困惑,今年夏天即将发布的版本(希望)会很快改变这一点。
因此,在11月份的us.yaml中,它应该是:
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发布于 2013-05-15 08:28:38
感恩节是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文件中使用函数来定义它,在星期五之后使用thanksgiving+1来定义它。
https://stackoverflow.com/questions/16549690
复制相似问题