Ruby on rails 3.2 如何为感恩节后的一天编写函数?假日宝石,YAML文件

Ruby on rails 3.2 如何为感恩节后的一天编写函数?假日宝石,YAML文件,ruby-on-rails-3.2,yaml,Ruby On Rails 3.2,Yaml,我正在编写一个应用程序,通过日期范围跟踪休假时间,我的部分计算确保不包括周末和假期。为了跟踪假期,我使用了holidays gem()的分叉版本,对其进行编辑以识别我公司认可的假期。我的叉子:() 到目前为止,一切对我来说都很好,但我遇到了感恩节后一天的问题,这是对原来的宝石的补充。这是YAML文件的摘录: 11: - name: Thanksgiving week: 4 regions: [us] wday: 4 - name: Day after Tha

我正在编写一个应用程序,通过日期范围跟踪休假时间,我的部分计算确保不包括周末和假期。为了跟踪假期,我使用了holidays gem()的分叉版本,对其进行编辑以识别我公司认可的假期。我的叉子:()

到目前为止,一切对我来说都很好,但我遇到了感恩节后一天的问题,这是对原来的宝石的补充。这是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月是从周五开始的,所以现在它说感恩节后的一天比实际的感恩节早一周。我试图查看所有其他假日的语法,看看是否有发生在浮动假日后一天的假日的先例,但我找不到(我发现的最接近耶稣受难节和复活节的事,但复活节有它自己的单独方法)。有没有关于如何为此编写函数的想法


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

感恩节是11月的第四个星期四,所以第二天就是那一天+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
然后运行测试:[测试周已满]

 rake
然后重建你的宝石

注:
将感恩节定义为方法可能更有意义,然后在yaml文件中使用函数定义感恩节,然后在星期五之后使用感恩节+1。

Shawn的答案基本正确,但实际上应该在原始文件中放置特定于区域的方法。其思想是,您不需要触摸.rb文件来创建新的定义,只需触摸.yaml文件即可。lib/holidays.rb实际上是用于一般代码规则(例如,工作日、周末等),而不是特定于某个地区的规则。我知道这有点让人困惑,即使你没有严格遵守规则,今年夏天即将发布的版本(希望)很快就会改变这一点

因此,在美国,yaml的11月份应为:

11: 
- name: Thanksgiving
  week: 4
  regions: [us]
  wday: 4
- name: Day after Thanksgiving
  function: day_after_thanksgiving(year)
  regions: [us]
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
在同一文件中的方法下(其中定义了美国就职日,至少在主版本中),应为:

11: 
- name: Thanksgiving
  week: 4
  regions: [us]
  wday: 4
- name: Day after Thanksgiving
  function: day_after_thanksgiving(year)
  regions: [us]
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\u-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

工作完美。非常感谢你!