一个取节假日的 API

以前在澳洲企业里运营 IT 业务时,节假日的一些工厂里需要跑的 job,都是需要手工处理,没有一个比较合理的办法,我进入管理该公司 IT 部门后,当时手工写了个 holiday.txt ,来判断节假日。

这次在做股票数据抓取的时候,也要判断节假日,索性写一个 API 来实现。

调用示例格式是:

https://api.yj777.cn/holiday/?d=yyyy-mm-dd&c=cn

d 是日期,c 是两位字母国家代码(默认 cn)。

日期格式支持如下类型,

这里有一个坑就是 通过 strtotime() 是否返回 false 来判断日期格式是否合法是不靠谱的,例如 2月30日,9月31日都会被判断成有效的日期,返回整型变量,而不是 false.

所以,只能根据输入的约定俗成的格式,取出年月日,用 checkdate() 来判断日期的合法性。

再重新组合成 yyyy-mm-dd 格式和数据库里存放的数据比对。

// mm/dd/yyyy – 02/01/2003 – strtotime() returns : 1st February 2003
// mm/dd/yy – 02/01/03 – strtotime() returns : 1st February 2003
preg_match(‘/(\d{2})\/(\d{2})\/(\d{2,4})$/’,$date,$m);
if ($m) { $month = $m[1]; $day = $m[2]; $year = $m[3];}

// yyyy/mm/dd – 2003/02/01 – strtotime() returns : 1st February 2003
preg_match(‘/(\d{4})\/(\d{2})\/(\d{2})$/’,$date,$m);
if ($m) { $year = $m[1]; $month = $m[2]; $day = $m[3];}

// dd-mm-yyyy – 01-02-2003 – strtotime() returns : 1st February 2003
preg_match(‘/(\d{2})-(\d{2})-(\d{4})$/’,$date,$m);
if ($m) { $day = $m[1]; $month = $m[2]; $year = $m[3];}
// echo “Y:$year, M:$month, D:$day\n”;

// yy-mm-dd – 03-02-01 – strtotime() returns : 1st February 2003
// yyyy-mm-dd – 2003-02-01 – strtotime() returns : 1st February 2003
preg_match(‘/(\d{2,4})-(\d{2})-(\d{2})$/’,$date,$m);

// 格式不对,返回空串
if (!$year or !$month or !$day) return(json_encode($val));
if (!checkdate($month,$day,$year)) return(json_encode($val));
$date = date(“Y-m-d”,strtotime($year.”-“.$month.”-“.$day));

$c = get_country();
if (!$country) $country = $c ? $c : ‘cn’;

这里还使用了一个比较有趣的函数 geoip_country_code_by_name 能根据 IP 地址,准确返回国家代码。

function get_country() {
// 返回两位字母小写的国家代码
$ip = $_SERVER[‘REMOTE_ADDR’];
return strtolower(geoip_country_code_by_name($ip));
}

好了,很简单,如果要查看当天是否节假日,就在浏览器输入:

https://api.yj777.cn/holiday/

返回:JSON 格式: [“2017-09-21″,”cn”,2,”工作日”]

返回字段解释如下:

  1. 日期,以 yyyy-mm-dd 格式返回,不管输入格式是什么,日期输入格式必须符合以上代码中注释。
  2. 国家代码,目前只支持 cn,就是天朝的节假日了。以后有机会可以把全世界的节假日都搞进去,不过很难,因为有些国家,州和州之间的节假日都不一样,譬如土澳。
  3. 类型代码:1:公共假日,2:工作日,3:普通周末
  4. 类型的文字表述,如果是公共假日,返回假日的名字,例如“端午节”,其他则返回“工作日”或者“普通周末”,注意,如果遇到公共假日周末调休,周末是工作日,返回代码是2,但是名称可能是节日的名称而不是“工作日”。

作者: 甬洁网络

--移动互联网&物联网技术提供商