项目中有需求:
判断指定日期,是否为节假日、双休日、工作日。
简单想了下,双休日可能也上班,工作日可能休息。另外每年的节假日,放假时间,还真不知道!
自己做不出来,就在网上找答案:
推荐一篇文章:
https://www.aspirantzhang.com/learning/is-holiday.html
没细看,看他里面提到了 'juhe.cn' 聚合数据,申请了下接口,免费用户每天100次,但是只能判断是否为 '假期',并不能判断,今天是否休息!例如:星期日,是休息日,但是得上班。
在网上搜日历:
百度:日历
各种万年历哈,百度的、其他的...
百度的就很好,但是分析了半天,找不到它调用的接口,最终找到了(本来都打算用其他家的了,也可以分析出来,但是肯定速度没百度的快!),处理了下,可以判断出来。这里分享下代码,laravel 框架的(不要吐槽代码质量,我就这水平)
// 门面类(Facades)
use Illuminate\Support\Facades\Cache;
// 其他底层类
use GuzzleHttp\Client;
/**
* 通过 『百度』 获取万年历 - 获取单月
*/
if ( !function_exists('baidu_calendar_days')) {
function baidu_calendar_days($month = '')
{
$api_url = 'http://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={month}&co=&resource_id=6018';
// 未传入日期,取当天日期
if(empty($month)){
$month = date('Y年n月');
// 传入的是 『时间戳格式』
}elseif(strpos($month, '-') === false){
$month = date('Y年n月', $month);
// 传入的是 『YYYY-MM-DD格式 或 YYYY-MM 等其他格式』
}else{
$month = date('Y年n月', strtotime($month));
}
$api_url = str_replace('{month}', $month, $api_url);
// 借助 Guzzle 发起请求
$client = new Client();
$response = $client->request('GET', $api_url, [
'headers' => [
],
// 发现 query 为 [],一直报错!(这里先记录下,按理说不应该报错!允许这种写法!)
// 'query' => [
// ],
]);
$body = $response->getBody();
$content = $body->getContents();
$content = mb_convert_encoding($content, 'UTF-8', 'GBK');
$content_to_json = json_decode($content, true);
if($content_to_json['status'] == 0){
return error(0, '获取日期成功!', ['days' => $content_to_json['data'][0]]);
}else{
return error(1, '获取日期失败!');
}
}
}
/**
* 通过 『百度』 获取万年历 - 判断当天是否休息
*/
if ( !function_exists('day_type')) {
function day_type($date = '')
{
/*
holiday - 节假日
weekend - 双休
weekday - 工作日
*/
// 获取月份
$date = $date ?: date('Y-m-d');
// 优先从缓存中获取
$cache_key = 'day_type_' . $date;
if(Cache::has($cache_key)){
return Cache::get($cache_key);
}
$month = date('Y-n', strtotime($date));
$days = baidu_calendar_days($month);
if($days['errno'] != 0){
$day_type = 'weekday';
}else{
// 如果当月存没有节假日,正常的周六、日休息
if(empty($days['days']['holiday'])){
$day_week = date('w', strtotime($date));
if($day_week == 0 || $day_week == 6){
return 'weekend';
$day_type = 'weekend';
}else{
$day_type = 'weekday';
}
}else{
// 如果当月存有节假日,我们优先判断是否节假日
$day_type = '';
foreach($days['days']['holiday'] as $holidays){
foreach($holidays['list'] as $holiday){
if(date('Y-n-j', strtotime($date)) == $holiday['date']){
// 节假日中 status == 1,表示 '节假日'
if($holiday['status'] == 1){
$day_type = 'holiday';
// 节假日中 status == 2,表示 '工作日'
}elseif($holiday['status'] == 2){
$day_type = 'weekday';
}
}
}
}
// 未匹配到节假日,正常的周六、日休息
if(empty($day_type)){
// 未匹配到节假日,正常的周六、日休息
$day_week = date('w', strtotime($date));
if($day_week == 0 || $day_week == 6){
$day_type = 'weekend';
}else{
$day_type = 'weekday';
}
}
}
}
// 设置缓存
Cache::forever($cache_key, $day_type);
return $day_type;
}
}
/**
* 通过 'www.juhe.cn' 获取万年历
*/
if ( !function_exists('juhe_calendar_day')) {
function juhe_calendar_day($date = '')
{
$app_key = 'cf144c4025f46dce0de5820a76c40090';
$api_url = 'http://v.juhe.cn/calendar/day';
// 未传入日期,取当天日期
if(empty($date)){
$date = date('Y-n-j');
// 传入的是 『时间戳格式』
}elseif(strpos($date, '-') === false){
$date = date('Y-n-j', $date);
// 传入的是 『YYYY-MM-DD格式』
}else{
$date = date('Y-n-j', strtotime($date));
}
// 借助 Guzzle 发起请求
$client = new Client();
$response = $client->request('GET', $api_url, [
'query' => [
'key' => $app_key,
'date' => $date,
],
]);
$body = $response->getBody();
$content = $body->getContents();
$content_to_json = json_decode($content, true);
/*
返回值判断:
1.有 'holiday' 元素,说明是 '节假日',肯定 '休息'
2.无 'holiday' 元素,其他时间,无法判断是否 '休息'
*/
if($content_to_json['error_code'] == 0){
return error(0, '获取日期成功!', ['date' => $content_to_json['result']['data']]);
}else{
return error(1, '获取日期失败!失败原因:' . $content_to_json['reason']);
}
// https://www.baidu.com/cache/aladdin/ui/lunar6/lunar6.js?v=20170208
}
}
/**
* 通过 'https://wannianrili.51240.com/' 获取万年历 - 获取单月
*/
if ( !function_exists('wannianrili_calendar_days')) {
function wannianrili_calendar_days($month = '')
{
$api_url = 'https://wannianrili.51240.com/ajax/?q=2018-06';
// 这里返回的是 html 结构,我们可以使用 『QueryList』 来解析
}
}