首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为感恩节后的第二天写一个函数?假日宝石,YAML文件

如何为感恩节后的第二天写一个函数?假日宝石,YAML文件
EN

Stack Overflow用户
提问于 2013-05-15 01:53:48
回答 2查看 529关注 0票数 3

我正在写一个通过日期范围跟踪休假的应用程序,我的部分计算确保不包括周末和节假日。为了跟踪假日,我使用了一个分叉版本的holidays gem(https://github.com/alexdunae/holidays),编辑它以识别我的公司能够识别的假日。我的叉子:(https://github.com/rclark4/holidays)。

到目前为止,对我来说一切都很好,但我遇到了感恩节后的一天的问题,它是对原始宝石的补充。这是YAML文件的摘录:

代码语言:javascript
复制
  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月是星期五,所以现在它说感恩节后的一天比实际感恩节早一周。我试图查看所有其他假日的语法,看看是否有浮动假日后第二天发生的假日的先例,但我找不到一个(我找到的最接近复活节的是耶稣受难节,但复活节完全有它自己的独立方法)。有没有关于如何为此编写函数的想法?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 01:51:29

Shawn的答案大部分是正确的,但实际上您应该将特定于区域的方法放在原始文件中。这个想法是,你不应该需要接触.rb文件来进行新的定义,只需要接触.yaml文件。lib/holidays.rb实际上是通用的代码规则(如to_weekday_if_weekend等),而不是特定于某个区域的规则。我知道,即使你不严格遵循规则,它也能工作,这有点令人困惑,今年夏天即将发布的版本(希望)会很快改变这一点。

因此,在11月份的us.yaml中,它应该是:

代码语言:javascript
复制
11: 
- name: Thanksgiving
  week: 4
  regions: [us]
  wday: 4
- name: Day after Thanksgiving
  function: day_after_thanksgiving(year)
  regions: [us]

在同一文件(其中定义了us_inauguration_day,至少在主版本中)中的方法下,应该是:

代码语言:javascript
复制
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 ),我拉出了你的副本来匹配你的测试,但作为参考:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-05-15 08:28:38

感恩节是11月的第4个星期四,所以第二天就是那一天+1。Date.calculate_mday是由假日宝石加上的。

在lib/holidays.rb中

代码语言:javascript
复制
def self.day_after_thanksgiving(year)
  Date.civil(year,11,Date.calculate_mday(year,11,:fourth,:thursday)+1)
end

在data/us.yaml中,将假日更改为:

代码语言:javascript
复制
 - name: Day after Thanksgiving
    function: day_after_thanksgiving(year)
    regions: [us]

确保你安装了珠宝商

代码语言:javascript
复制
 rake defs:build_all

然后运行测试: test_full_week已经损坏了

代码语言:javascript
复制
 rake

然后重建你的宝石。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16549690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档