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

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

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

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



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断当前日期是否节假日双休日,可以使用Java 8中的java.time包中的类和方法。具体可以按照以下步骤进行操作: 1. 首先,需要创建一个LocalDate对象表示当前日期,可以使用now()方法获取当前日期: ```java LocalDate today = LocalDate.now(); ``` 2. 判断当前日期是否节假日,可以使用第三方API或者自己实现一个判断方法。这里以自己实现为例,假设节假日包括元旦节、春节、清明节、劳动节、端午节、中秋节、国庆节。可以定义一个方法,判断当前日期是否在这些节假日之一: ```java public static boolean isHoliday(LocalDate date) { int month = date.getMonthValue(); int day = date.getDayOfMonth(); if ((month == 1 && day == 1) || // 元旦节 (month == 2 && day >= 4 && day <= 10) || // 春节 (month == 4 && day >= 4 && day <= 6) || // 清明节 (month == 5 && day >= 1 && day <= 3) || // 劳动节 (month == 6 && day >= 12 && day <= 14) || // 端午节 (month == 9 && day >= 19 && day <= 21) || // 中秋节 (month == 10 && day >= 1 && day <= 7)) { // 国庆节 return true; } return false; } ``` 3. 判断当前日期是否双休日,可以使用DayOfWeek枚举类的值来判断。如果当前日期是星期六或星期日,则认为是双休日。可以使用getDayOfWeek()方法获取当前日期的星期几: ```java public static boolean isWeekend(LocalDate date) { DayOfWeek dayOfWeek = date.getDayOfWeek(); return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY; } ``` 4. 最后,可以通过调用上面定义的方法来判断当前日期是否节假日双休日: ```java if (isHoliday(today)) { System.out.println("今天是节假日!"); } else if (isWeekend(today)) { System.out.println("今天是双休日!"); } else { System.out.println("今天是工作日!"); } ``` 需要注意的是,判断节假日需要根据具体情况调整,例如春节日期会根据农历而有所不同。同时,如果需要判断其他国家或地区的节假日,也需要根据当地情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值