3

我正在编写一个通过日期范围跟踪休假的应用程序,我的部分计算确保排除周末和节假日。为了跟踪假期,我使用了假期 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 月从星期五开始,所以现在说感恩节后的第二天是前一周实际上是。我试图查看所有其他假期的语法,看看是否有在浮动假期后的第二天发生的假期的先例,但我找不到(我发现的最接近的事情是耶稣受难日到复活节,但复活节完全有它自己的单独方法)。关于如何为此编写函数的任何想法?

如果您需要更多信息,请告诉我!

4

2 回答 2

2

肖恩的回答大部分是正确的,但您实际上应该将特定于区域的方法放在原始文件中。这个想法是,您不需要触摸 .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-16T17:51:29.237 回答
2

感恩节是 11 月的第 4 个星期四,所以后天是那天 +1。Date.calculate_mday 由假期 gem 添加。

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

于 2013-05-15T00:28:38.200 回答