项目中有需求:判断指定日期,是否为节假日、双休日、工作日。简单想了下,双休日可能也上班,工作日可能休息。另外每年的节假日,放假时间,还真不知道!自己做不出来,就在网上找答案:推荐一篇文章:/learning/is-holiday.html没细看,看他里面提到了 '' 聚合数据,申请了下接口,免费用户每天100次,但是只能判断是否为 '假期',并不能判断,今天是否休息!例如:星期日,是休息日,但是得上班。在网上搜日历:百度:日历各种万年历哈,百度的、其他的...百度的就很好,但是分析了半天,找不到它调用的接口,最终找到了(本来都打算用其他家的了,也可以分析出来,但是肯定速度没百度的快!),处理了下,可以判断出来。这里分享下代码,laravel 框架的(不要吐槽代码质量,我就这水平)// 门面类(Facades)use Illuminate\Support\Facades\Cache;// 其他底层类use GuzzleHttp\Client;/*** 通过 『百度』 获取万年历 - 获取单月*/if ( !function_exists('baidu_calendar_days')) {function baidu_calendar_days($month = ''){$api_url = '/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;}}/*** 通过 '' 获取万年历*/if ( !function_exists('juhe_calendar_day')) {function juhe_calendar_day($date = ''){$app_key = 'cf144c4025f46dce0de5820a76c40090';$api_url = '/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']);}// /cache/aladdin/ui/lunar6/lunar6.js?v=0208}}/*** 通过 '/' 获取万年历 - 获取单月*/if ( !function_exists('wannianrili_calendar_days')) {function wannianrili_calendar_days($month = ''){$api_url = '/ajax/?q=-06';// 这里返回的是 html 结构,我们可以使用 『QueryList』 来解析}}
200字范文,内容丰富有趣,生活中的好帮手!