判断指定日期是否为节假日、双休日、工作日

项目中有需求:
	判断指定日期,是否为节假日、双休日、工作日。

简单想了下,双休日可能也上班,工作日可能休息。另外每年的节假日,放假时间,还真不知道!
自己做不出来,就在网上找答案:

	推荐一篇文章:
		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』 来解析
        }
    }



猜你喜欢

转载自blog.csdn.net/beyond__devil/article/details/80654580