Gem 写了一个 2016年 中国节假日gem,判断 Time 或 Date 是否是节日,很适合新手学习

superbatironmans5 · 2016年02月29日 · 最后由 ruby_xi 回复于 2017年05月27日 · 4698 次阅读

China-Holiday 由于工作需要统计人员工作效率,需要去除掉节假日,所以写了这个 gem,以后需要的朋友就不用再对着日历一个个找了 原理就是把holiday?实例方法加入到了 Rails 的 DateTime这两个 Class 中

# Date instance method
"2016-01-01".to_date.holiday? # true

# Time instance method 
"2016-01-01 20:11:12 +0800".to_time.holiday? # true

下面是包括的节日,节日信息来源是百度日历

 {
  "holidays": [
    "2016-01-01",// 元旦
    "2016-01-02",
    "2016-01-03",
    "2016-02-07",// 春节
    "2016-02-08",
    "2016-02-09",
    "2016-02-10",
    "2016-02-11",
    "2016-02-12",
    "2016-02-13",
    "2016-04-02",// 清明节
    "2016-04-03",
    "2016-04-04",
    "2016-04-30",// 劳动节
    "2016-05-01",
    "2016-05-02",
    "2016-06-09",// 端午节
    "2016-06-10",
    "2016-06-11",
    "2016-09-15",// 中秋节
    "2016-09-16",
    "2016-09-17",
    "2016-10-01",// 国庆节
    "2016-10-02",
    "2016-10-03",
    "2016-10-04",
    "2016-10-05",
    "2016-10-06",
    "2016-10-07",
    "2016-02-28"
  ]
}

源码在这里: https://github.com/DawnyWu/china-holidays

怎么感觉 Ruby 里少有用 json 作配置的喃,一般都用 yaml 的样。

缺少手动更新假期日期列表的接口

https://www.juhe.cn/docs/api/id/177/aid/601 考虑用 api 自动更新啊,手动的多麻烦啊。

恕我之言,您这是反面教材吧,,,

@taojay315 之前不知道有这种东西,谢谢哈

@watraludru 我说小(马)马(甲)啊,我的意思是可以让新手学习下如何向 rails 的类中添加方法,轻喷,谢谢

我刚刚提交了中国节假日在 holidays gems 上的支持 PR,这个是自动更新的,但是,我真的写了后发现,国家随便拉周六周日任意组合小长假也是跪了,太难写,不过至少也有一个雏形了。

ericguo 回复

您好,现在这个 GEM,还不支持中国节假日么! PR 没接受? 我测试的时候,没用。

ruby_xi 回复

没继续搞,中国节假日实在太变态了,比如今天,周六换周一,这个 holidays 本身就不支持(也许支持,记不清了,不过绝对无法定义只出现一次的反法西斯胜利放假日),也许还是楼主这样老老实实定义是唯一可行办法。。。

ericguo 回复

所有涉及时间的库都要充满各种特殊情况不停的手动追加。比如 Stack Overflow 有个问题说遇到了一个诡异的 bug,两个只差 1 秒的时间 Java 返回了 343 秒:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

出现这个问题是因为系统时区是 Asia/Shanghai。而民国 17 年(1928 年),原中央观象台的业务由南京政府中央研究院的天文研究所和气象研究所分别接收。天文研究所编写的历书基本上沿袭中央观象台的做法,仍将全国划分为 5 个标准时区,只是在有关交气、合朔、太阳出没时刻等处,不再使用北平的地方平时,而改以南京所在的标准时区的区时即东经 120°标准时替代。(来源)

显然这种变化全部都是硬编码进库的,同理的还有 UTC 的各种闰秒。所以一个时间库要做好,维护的成本相当高。同理像 Rails 中提供的类似于 3.hours.ago 都是不考虑闰秒的,如果你的系统对时间要求很高的话,就容易爆炸。

ericguo 回复

谢谢你的回复,开始我想当然了,去获取节假日的时间,然后自己手动处理。结果还有你说的那种情况,也是醉了。 准备手动添加了。反正一年添加一次,没办法。

dsh0416 回复

看到你的分析,已经炸了。

换休和连休的日子只是普通的周末,不应该当作 holiday。

回复一楼:JSON 连注释都没有,不适合做配置

需要 登录 后方可回复, 如果你还没有账号请 注册新账号