zoukankan      html  css  js  c++  java
  • 支持节假日,支持经纬度,支持调休时控器

    1.时控器为什么要支持经纬度?

       我国地大物博,每个地区天亮天黑时间不一样,东部沿海与中部地区相差近1个小时.新疆地区更多,北京时间晚上23点还没黑.因此PHP 函数date_sunrise()可以直接根据经纬度输出天黑时间.

    http://www.wmdfw.com/jiejiari/jiejiari.php
    返回JSON数据:
    zhouein({"code":"200","msg":"success","newslist":[{"city":"HangZhou","cnweekday":"星期四","correctsunsettime":"17:31","date":"2020-11-12","daycode":0,"end":"","enname":"","holiday":"","info":"工作日","isnotwork":0,"latitude":"30.26667","longitude":"120.20000","lunarday":"廿七","lunarmonth":"九月","lunaryear":"庚子","name":"","remarks":"不开灯","rest":"","start":"","sunrisetime":"06:25","sunsettime":"17:01","tip":"","vacation":"","weekday":4}]})
    View Code

    2.目前我们法定节假日是根据国务院办公厅下发通知,春节,元旦,端午等休息,又考虑到五一放个小长假,将前后某几天周末调休.每年都不一样,程序上很难实现统一的标准.因此写了一个法定节假日的列表.

    //法定节假日 daycode=1 
        $lst_holiday = [
            '2020-1-1' => '元旦',
            '2020-1-24' => '春节',
            '2020-1-25' => '春节假',
            '2020-1-26' => '春节假',
            '2020-1-27' => '春节假',
            '2020-1-28' => '春节假',
            '2020-1-29' => '春节假',
            '2020-1-30' => '春节假',
            '2020-4-4' => '清明节',
            '2020-4-5' => '清明假',
            '2020-4-6' => '清明假',
            '2020-5-1' => '劳动节',
            '2020-5-2' => '劳动假',
            '2020-5-3' => '劳动假',
            '2020-5-4' => '劳动假',
            '2020-5-5' => '劳动假',
            '2020-6-25' => '端午节',
            '2020-6-26' => '端午假',
            '2020-6-27' => '端午假',
            '2020-10-1' => '国庆',
            '2020-10-2' => '国庆假',
            '2020-10-3' => '国庆假',
            '2020-10-4' => '国庆假',
            '2020-10-5' => '国庆假',
            '2020-10-6' => '国庆假',
            '2020-10-7' => '国庆假',
            '2020-10-8' => '国庆假',
        ];
     
     
        // 调休日 (传统节日前后补班)daycode=3
        $lst_working_day = [
            '2020-1-19' => '春节调休',
            '2020-2-1' => '春节调休',
            '2020-4-26' => '劳动节调休',
            '2020-5-9' => '劳动节调休',
            '2020-6-28' => '端午调休',
            '2020-9-27' => '国庆调休',
            '2020-10-10' => '国庆调休',
        ];
    3.剩下就是诸如周末休假具有规律的查询,PHP 语言也好,其他的语言都很轻松.
        $weekarray=array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        $cnweekday = $weekarray[date("w",strtotime($date))];
    
        if((date('w',strtotime($date))==6) || (date('w',strtotime($date)) == 0)){
            if (key_exists($date, $lst_working_day)) {
                $daycode=3;
                $info = "调休日";
                //echo "{'daycode':".$daycode."}";
                //echo "调休日";
             }
    
    
    
    4.上全代码:
    <?php
    //header("Content-Type: text/html; charset=utf-8");
    header('Content-type: application/json');  
    if(isset($_REQUEST["callback"])){
       $callback = $_REQUEST["callback"];
       }else{
       $callback = "zhouein";
       }
    if(isset($_REQUEST["date"])){
       $date = $_REQUEST["date"];
       }else{
       $date = date("Y-m-d");
       }
    if(isset($_REQUEST["correcttime"])){
       $correcttime = $_REQUEST["correcttime"];
       }else{
       $correcttime = 30;  //修正时间,正为延迟,负为提前,单位分钟
       }
    if(isset($_REQUEST["latitude"])){
       $latitude = $_REQUEST["latitude"];
       }else{
       $latitude = '30.26667';
       }
    if(isset($_REQUEST["longitude"])){
       $longitude = $_REQUEST["longitude"];
       }else{
       $longitude = '120.20000';
       }
    if(isset($_REQUEST["tianding"])){
       $tianding = $_REQUEST["tianding"];
       }else{
       $tianding = 90;
       }
    if(isset($_REQUEST["shiqu"])){
       $shiqu = $_REQUEST["shiqu"];
       }else{
       $shiqu = 8;
       }
        //计算日落日出时间
        $sunrise = date_sunrise(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunset=date_sunset(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunsetcorrect = date("H:i", strtotime("$sunset +$correcttime min"));
    function is_weekend($date,$callback){
    //法定节假日 daycode=1 
        $lst_holiday = [
            '2020-1-1' => '元旦',
            '2020-1-24' => '春节',
            '2020-1-25' => '春节假',
            '2020-1-26' => '春节假',
            '2020-1-27' => '春节假',
            '2020-1-28' => '春节假',
            '2020-1-29' => '春节假',
            '2020-1-30' => '春节假',
            '2020-4-4' => '清明节',
            '2020-4-5' => '清明假',
            '2020-4-6' => '清明假',
            '2020-5-1' => '劳动节',
            '2020-5-2' => '劳动假',
            '2020-5-3' => '劳动假',
            '2020-5-4' => '劳动假',
            '2020-5-5' => '劳动假',
            '2020-6-25' => '端午节',
            '2020-6-26' => '端午假',
            '2020-6-27' => '端午假',
            '2020-10-1' => '国庆',
            '2020-10-2' => '国庆假',
            '2020-10-3' => '国庆假',
            '2020-10-4' => '国庆假',
            '2020-10-5' => '国庆假',
            '2020-10-6' => '国庆假',
            '2020-10-7' => '国庆假',
            '2020-10-8' => '国庆假',
        ];
     
     
        // 调休日 (传统节日前后补班)daycode=3
        $lst_working_day = [
            '2020-1-19' => '春节调休',
            '2020-2-1' => '春节调休',
            '2020-4-26' => '劳动节调休',
            '2020-5-9' => '劳动节调休',
            '2020-6-28' => '端午调休',
            '2020-9-27' => '国庆调休',
            '2020-10-10' => '国庆调休',
        ];
        $weekarray=array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        $cnweekday = $weekarray[date("w",strtotime($date))];
    
        if((date('w',strtotime($date))==6) || (date('w',strtotime($date)) == 0)){
            if (key_exists($date, $lst_working_day)) {
                $daycode=3;
                $info = "调休日";
                //echo "{'daycode':".$daycode."}";
                //echo "调休日";
             }
            elseif (key_exists($date, $lst_holiday)) {
                $daycode=1;
                $info = "法定节假日";
                //echo "{'daycode':".$daycode."}";
                //echo "法定节假日";
             }else{
                $daycode=2;
                $info = "双休日";
                //echo '双休日'.date('w',strtotime($date)).'$daycode=2'; 
             }
    
          }else{
              //echo '工作日'.date('w',strtotime($date));
              $daycode=0;
              $info = "工作日";
              //echo "{'daycode':".$daycode."}";
          }
          //print_r($daycode);
          $arry= array(
            'code' => '200',
            'msg' => 'success',
            'newslist' => array(
                '0'=>array(
                    'city' => 'HangZhou',
                    'cnweekday' => $cnweekday,
                    'correctsunsettime' => '17:37',
                    'date' => '2020-10-11',
                    'daycode'=>$daycode,
                    'end' => '',
                    'enname' => '',
                    'holiday' => '',
                    'info' => $info,
                    'isnotwork' => 1,
                    'latitude' => '30.26667',
                    'longitude' => '120.20000',
                    'lunarday' => '廿五',
                    'lunarmonth' => '八月',
                    'lunaryear' => '庚子',
                    'name' => '',
                    'remarks' => '开灯',
                    'start' => '',
                    'sunrisetime' => '06:18',
                    'sunsettime' => '17:07',
                    'tip' => '',
                    'vacation' => '',
                    'weekday' => 0
               )
            ),
                  
          );
          $json_date=json_encode($arry,JSON_UNESCAPED_UNICODE);//转换为json数据
          //print_r($arry);
          echo $callback."(".$json_date.")";
          
       }
    is_weekend($date,$callback);
    ?>
    View Code
    
    

      5.查询别的平台,再显示的数据的代码:

    <?php
    //header("Content-Type: text/html; charset=utf-8");
    header('Content-type: application/json');          
    if(isset($_REQUEST["callback"])){
       $callback = $_REQUEST["callback"];
       }else{
       $callback = 'zhouein';
       }
    if(isset($_REQUEST["date"])){
       $date = $_REQUEST["date"];
       }else{
       $date = date("Y-m-d");
       }
    if(isset($_REQUEST["correcttime"])){
       $correcttime = $_REQUEST["correcttime"];
       }else{
       $correcttime = 30;  //修正时间,正为延迟,负为提前,单位分钟
       }
    if(isset($_REQUEST["latitude"])){
       $latitude = $_REQUEST["latitude"];
       }else{
       $latitude = '30.26667';
       }
    if(isset($_REQUEST["longitude"])){
       $longitude = $_REQUEST["longitude"];
       }else{
       $longitude = '120.20000';
       }
    if(isset($_REQUEST["tianding"])){
       $tianding = $_REQUEST["tianding"];
       }else{
       $tianding = 90;
       }
    if(isset($_REQUEST["shiqu"])){
       $shiqu = $_REQUEST["shiqu"];
       }else{
       $shiqu = 8;
       }
        //计算日落日出时间
        $sunrise = date_sunrise(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunset=date_sunset(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunsetcorrect = date("H:i", strtotime("$sunset +$correcttime min"));
        //查询国家法定节假日
        $date = file_get_contents ('http://api.tianapi.com/txapi/jiejiari/index?key=KEY自己申请&date='.$date );//API接口
        $json = json_decode($date,true);//将json解析成数组
        $tip=$json['newslist']['0']['tip'];
    
    function zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks,$callback){
          $number = array(
                'city'              => 'HangZhou',
                'latitude'          => $latitude,
                'longitude'         => $longitude,
                'sunrisetime'       => $sunrise,
                'sunsettime'        => $sunset,
                'correctsunsettime' => $sunsetcorrect,
                'remarks'               => $remarks
                
                );
        $hebing = array_merge_recursive($json['newslist']['0'], $number);
        ksort($hebing);
        $arryA= array(
            'code' => '200',
            'msg' => 'success',
            'newslist' => Array
                  (
                  '0' =>$hebing
                  )
        );
    
        $json_date=json_encode($arryA,JSON_UNESCAPED_UNICODE);//转换为json数据
        //print_r($arryA);
        echo $callback ."(". $json_date.")";
    }
    
      if($json['code'] == 200){ //判断状态码
          if($json['newslist']['0']['daycode'] == 0){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='不开灯',$callback);
          }
          if($json['newslist']['0']['daycode'] == 1){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='开灯',$callback);
          }
          if($json['newslist']['0']['daycode'] == 2){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='开灯',$callback);
          }
          if($json['newslist']['0']['daycode'] == 3){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='不开灯',$callback);
          }
    
        }else{    
            echo "返回错误,状态消息:".$json['msg'];
          }
    
    
    ?>
      6.因此,我们想在休息日(周末,以及法定节假日,排除调休)在天黑前打开路灯,我们是不是不难做到了?  再举例来说,工作日(周一到周五,以及调班,排除法定节假日).
    7.接下来,我们需要去找一个智能开关,目前市场上的云平台只支持简单的周一到周日,几点到几点,很显然是不支持法定佳节日和经纬度天黑.我们将解析到的JSON数据,定时同步到云平台即可.
    8.根据有人物联网云平台提供的API,采用 PHP 中的函数CURL 去模拟登录,提交数据.见代码:
    <?php
    //公共方法
    /**
     * 模拟post进行url请求
     * @param $postUrl
     * @param $curlPost
     * @return string
     */
    function http_json_data($postUrl, $curlPost, $token) {
        if (empty($postUrl) || empty($curlPost)) {
            return false;
        }
        $ch = curl_init();//初始化curl
        $header = array();
        $header[] = 'Accept:application/json';
        $header[] = 'Content-Type:application/json';
        //兼容新版api接口,token在header中请求
        $header[] = 'token:'.$token;
        curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
        curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//验证对方的SSL证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//检查声称服务器的证书的身份
        $data = curl_exec($ch);//运行curl
        curl_close($ch);
        return $data;
        
    }
    function json_to_array($data) {    //得到数组,JSON转数组
          $data = json_decode($data,JSON_UNESCAPED_UNICODE);
          return $data;
       }
    function array_to_json($data) {    //得到JSON,数组转JSON
          $data = json_encode($data,JSON_UNESCAPED_UNICODE);
          return $data;
       }
    
       //登陆,想得到token
       $curlPost='{"account":"ci78dny8","password":"密码为MD5后的小写","platformId":"W3rfV"}';
       /* $curlPost=array{
           "account"=>"ci78dny8",
           "password"=>"密码为MD5后的小写",
           "platformId"=>"W3rfV"
           }; */
       $getToken = http_json_data($postUrl='https://openapi.mp.usr.cn/usrCloud/user/login', $curlPost,$token='');
       $usrInfo = json_decode($getToken,JSON_UNESCAPED_UNICODE);
       //$usrInfo = json_to_array($data);
       //echo $getToken;
       $token = $usrInfo['data']['token'];
       echo "//得到Token";
       echo "<BR>";
       echo $token;
       echo "<BR>";
       //得到定时器列表
       //$curlPost = '{"uid":'.$usrInfo['data']['uid'].'}';
       /* $curlPost = array{
             "uid"=>$usrInfo['data']['uid']
       } */
       //$getTask=http_json_data($postUrl='https://api.mp.usr.cn/usrCloud/timing/getTimingTasksByUid', $curlPost, $token);
       //echo $getTask;
    
       //修改定时器
       //$curlPost = '{"id":1330,"name":"u672au547du540d_u5b9au65f6u4efbu52a1_78","projectId":33222,"cronType":1,"recordType":1,"deviceNo":"01001219121100008587","taskTargets":[{"slaveIndex":"1","dataId":587555,"sendData":"0","cronWeek":"7,1","cronHour":"18","cronMinute":"44"}]}';
    
       //$updateTask=http_json_data($postUrl='https://api.mp.usr.cn/usrCloud/timing/updateTimingTask', $curlPost, $token);
       //echo $updateTask;
       //增加定时器
       $curlPost = '{"name":"u672au547du540d_u5b9au65f6u4efbu52a1_12","projectId":33222,"cronType":1,"recordType":1,"deviceNo":"01001219121100008587","taskTargets":[{"slaveIndex":"1","dataId":587555,"sendData":"0","cronWeek":"2,1,7","cronHour":22,"cronMinute":4,"startDt":1605141168000,"endDt":4102415940000,"taskType":1}]}';
    
       $updateTask=http_json_data($postUrl='https://api.mp.usr.cn/usrCloud/timing/addTimingTask', $curlPost, $token);
       echo "<BR>";
       echo "//反馈增加定时器结果";
       echo $updateTask;
    View Code
  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/zhouein/p/13963412.html
Copyright © 2011-2022 走看看