当前位置:首页 > CMS教程 > Thinkphp > 列表

ThinkPHP中获取指定日期后工作日的具体日期方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-31 14:18:40 浏览: 评论:0 

在本文中,我们给大家带来的是关于ThinkPHP中获取指定日期后工作日的具体日期的方法以及实例代码,有需要的朋友们学习下。

思路:

1、获取到查询年份内所有工作日数据数组

2、获取到查询开始日期在工作日的索引

3、计算需查询日期索引

4、获得查询日期

  1. /*创建日期类型记录表格*/ 
  2.  
  3. CREATE TABLE `tb_workday` ( 
  4.  
  5. `did` int(11) NOT NULL AUTO_INCREMENT, 
  6.  
  7. `exact_date` varchar(32) NOT NULL COMMENT '具体日期:格式date("Ymd");(20170205)'
  8.  
  9. `date_year` varchar(32) NOT NULL COMMENT '具体日期:格式date("Y");(2017)'
  10.  
  11. `date_type` tinyint(2) NOT NULL COMMENT '日期类型:0、工作日;1、特殊工作日;2、法定节假日'
  12.  
  13. PRIMARY KEY (`did`) 
  14.  
  15. ) ENGINE=InnoDB AUTO_INCREMENT=829 DEFAULT CHARSET=utf8 COMMENT='各年工作日&法定节假日数据' 
  16. <?php
  17.  
  18. class work_days 
  19.  
  20.  
  21.  /** 
  22.  
  23.  * 获取星期 
  24.  
  25.  * @param $date 
  26.  
  27.  * @return mixed 
  28.  
  29.  */ 
  30.  
  31.  function get_week($date
  32.  
  33.  { 
  34.  
  35.  //强制转换日期格式 
  36.  
  37.  $date_str = date('Y-m-d'strtotime($date)); 
  38.  
  39.  //封装成数组 
  40.  
  41.  $arr = explode("-"$date_str); 
  42.  
  43.  //参数赋值 
  44.  
  45.  //年 
  46.  
  47.  $year = $arr[0]; 
  48.  
  49.  //月,输出2位整型,不够2位右对齐 
  50.  
  51.  $month = sprintf('%02d'$arr[1]); 
  52.  
  53.  //日,输出2位整型,不够2位右对齐 
  54.  
  55.  $day = sprintf('%02d'$arr[2]); 
  56.  
  57.  //时分秒默认赋值为0; 
  58.  
  59.  $hour = $minute = $second = 0; 
  60.  
  61.  //转换成时间戳 
  62.  
  63.  $strap = mktime($hour$minute$second$month$day$year); 
  64.  
  65.  //获取数字型星期几 
  66.  
  67.  $number_wk = date("w"$strap); 
  68.  
  69.    
  70.  
  71.  //获取数字对应的星期 
  72.  
  73.  return $number_wk
  74.  
  75.    
  76.  
  77.  //自定义星期数组 
  78.  
  79.  //$weekArr = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"); 
  80.  
  81.    
  82.  
  83.  //获取数字对应的星期 
  84.  
  85.  //return $weekArr[$number_wk]; 
  86.  
  87.  } 
  88.  
  89.    
  90.  
  91.    
  92.  
  93.  /** 
  94.  
  95.  * 获取指定日期段内每一天的日期 
  96.  
  97.  * @param string $startdate 开始日期 
  98.  
  99.  * @param string $enddate 结束日期 
  100.  
  101.  * @return array 
  102.  
  103.  */ 
  104.  
  105.  function getDateFromRange($startdate$enddate
  106.  
  107.  { 
  108.  
  109.  $stimestamp = strtotime($startdate); 
  110.  
  111.  $etimestamp = strtotime($enddate); 
  112.  
  113.    
  114.  
  115.  // 计算日期段内有多少天 
  116.  
  117.  $days = ($etimestamp - $stimestamp) / 86400 + 1; 
  118.  
  119.    
  120.  
  121.  // 保存每天日期 
  122.  
  123.  $_list_date = array(); 
  124.  
  125.  for ($i = 0; $i < $days$i++) { 
  126.  
  127.  $_list_date[] = date('Y-m-d'$stimestamp + (86400 * $i)); 
  128.  
  129.  } 
  130.  
  131.  return $_list_date
  132.  
  133.  } 
  134.  
  135.    
  136.  
  137.  function curl_post($url$data = null) 
  138.  
  139.  { 
  140.  
  141.  $curl = curl_init(); 
  142.  
  143.  curl_setopt($curl, CURLOPT_URL, $url); 
  144.  
  145.  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
  146.  
  147.  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 
  148.  
  149.  if (!emptyempty($data)) { 
  150.  
  151.  curl_setopt($curl, CURLOPT_POST, 1); 
  152.  
  153.  curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
  154.  
  155.  } 
  156.  
  157.  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  158.  
  159.  $output = curl_exec($curl); 
  160.  
  161.  curl_close($curl); 
  162.  
  163.  return $output
  164.  
  165.  } 
  166.  
  167.    
  168.  
  169.  /** 
  170.  
  171.  * 更新数据库指定年份日期数据 
  172.  
  173.  * @param $year 
  174.  
  175.  * @return int 
  176.  
  177.  */ 
  178.  
  179.  function updateDate($year
  180.  
  181.  { 
  182.  
  183.  $startDate = date('Y-m-d'strtotime($year . '-01-01')); 
  184.  
  185.  $endDate = date('Y-m-d'strtotime('+1 year'strtotime($startDate)) - 86400); 
  186.  
  187.  $_list_date = self::getDateFromRange($startDate$endDate); 
  188.  
  189.    
  190.  
  191.  $url = 'http://api.goseek.cn/Tools/holiday';//自行查找的免费API 
  192.  
  193.    
  194.  
  195.  $m = M('tb_workday'); 
  196.  
  197.  $count = 0; 
  198.  
  199.    
  200.  
  201.  foreach ($_list_date as $k => $_date) { 
  202.  
  203.  $_ret = 0; 
  204.  
  205.  $_date = date('Ymd'strtotime($_date)); 
  206.  
  207.  $_post_data = array('date' => $_date); 
  208.  
  209.  $_ret_curl = curl_post($url$_post_data); 
  210.  
  211.  $_ret_curl = json_decode($_ret_curl, true); 
  212.  
  213.    
  214.  
  215.  //工作日 
  216.  
  217.  if ($_ret_curl['data'] == 0) { 
  218.  
  219.  $dateData['exact_date'] = $_date
  220.  
  221.  $dateData['date_year'] = $year
  222.  
  223.  $dateData['date_type'] = 0; 
  224.  
  225.  $_ret = $m->add($dateData) ? 1 : 0; 
  226.  
  227.  unset($dateData); 
  228.  
  229.    
  230.  
  231.    
  232.  
  233.  //工作日 判断是否为周末 
  234.  
  235.  if (in_array(self::get_week($_date), array(0, 1))) { 
  236.  
  237.   //特殊工作日 
  238.  
  239.   $dateData['exact_date'] = $_date
  240.  
  241.   $dateData['date_year'] = $year
  242.  
  243.   $dateData['date_type'] = 1; 
  244.  
  245.   $_ret = $m->add($dateData) ? 1 : 0; 
  246.  
  247.   unset($dateData); 
  248.  
  249.  } 
  250.  
  251.  } 
  252.  
  253.    
  254.  
  255.  //法定节假日 
  256.  
  257.  if ($_ret_curl['data'] == 2) { 
  258.  
  259.  $dateData['exact_date'] = $_date
  260.  
  261.  $dateData['date_year'] = $year
  262.  
  263.  $dateData['date_type'] = 2; 
  264.  
  265.  $_ret = $m->add($dateData) ? 1 : 0; 
  266.  
  267.  unset($dateData); 
  268.  
  269.  } 
  270.  
  271.    
  272.  
  273.  //休息日(周末) 暂不处理 
  274.  
  275.  /*if ($_ret_curl['data'] == 1) { 
  276.  
  277.    
  278.  
  279.  }*/ 
  280.  
  281.  $_ret && $count++; 
  282.  
  283.  unset($_date$_post_data$_ret_curl$_ret); 
  284.  
  285.  } 
  286.  
  287.  return $count
  288.  
  289.  } 
  290.  
  291.    
  292.  
  293.  /** 
  294.  
  295.  * 获取当年所有工作日 (从数据库获取,数据库无数据则先更新数据) 
  296.  
  297.  * @param string $year 当年年份 
  298.  
  299.  * @return array 
  300.  
  301.  */ 
  302.  
  303.  private function getWorkDays($year
  304.  
  305.  { 
  306.  
  307.  $m = M('tb_workday'); 
  308.  
  309.  $map['date_year'] = $year
  310.  
  311.  $map['date_type'] = 0; 
  312.  
  313.  $DateArray = $m->field('exact_date')->where($map)->select(); 
  314.  
  315.  if (!emptyempty($DateArray)) { 
  316.  
  317.  $DateArray = array_column($DateArray'exact_date'); 
  318.  
  319.  return $DateArray
  320.  
  321.  } else { 
  322.  
  323.  //更新数据库工作日数据 
  324.  
  325.  $ret = self::updateDate($year); 
  326.  
  327.  if ($ret > 0) { 
  328.  
  329.  return self::getWorkDays($year); 
  330.  
  331.  } else { 
  332.  
  333.  return false; 
  334.  
  335.  } 
  336.  
  337.  } 
  338.  
  339.  } 
  340.  
  341.    
  342.  
  343.  /** 
  344.  
  345.  * 获取开始日期后第N个工作日具体日期 
  346.  
  347.  * @param $startdate string 计算开始日期 需包含年月日信息 
  348.  
  349.  * @param $days int 间隔天数 
  350.  
  351.  * @return mixed 成功返回 对应日期,失败返回false 
  352.  
  353.  */ 
  354.  
  355.  public function getNextWorkDate($startdate$days
  356.  
  357.  { 
  358.  
  359.  $year = date('Y'strtotime($startdate)); 
  360.  
  361.  $startdate = date('Y-m-d'strtotime($startdate)); 
  362.  
  363.    
  364.  
  365.  $workDays = $this->getWorkDays($year); 
  366.  
  367.    
  368.  
  369.  $search_key = array_search(date('Ymd'strtotime($startdate)), $workDays); 
  370.  
  371.    
  372.  
  373.  if ($search_key === false) {//查询日期为非工作 
  374.  
  375.  //获取查询日期前最近工作日 
  376.  
  377.  $m = M('tb_workday'); 
  378.  
  379.  $map['date_year'] = $year
  380.  
  381.  $map['date_type'] = 0; 
  382.  
  383.  $map['DATE_FORMAT(`exact_date`,\'%Y-%m-%d\')'] = array('LT'$startdate); 
  384.  
  385.  $_search_date = $m->where($map)->order('`exact_date` DESC')->getField('exact_date'); 
  386.  
  387.  $search_key = array_search($_search_date$workDays); 
  388.  
  389.  unset($m$map$_search_date); 
  390.  
  391.  } 
  392.  
  393.    
  394.  
  395.  $t_key = $search_key + $days
  396.  
  397.    
  398.  
  399.  if ($t_key <= count($workDays) - 1) { 
  400.  
  401.  return date('Y-m-d'strtotime($workDays[$t_key])); 
  402.  
  403.  } else { 
  404.  
  405.  //查询日期已跨年 
  406.  
  407.  $n_days = $days - (count($workDays) - 1 - $search_key); 
  408.  
  409.  $next_year = $year + 1; 
  410.  
  411.  return $this->getNextWorkDate($next_year . '-01-01'$n_days - 1); 
  412.  
  413.  } 
  414.  
  415.  } 
  416.  
  417.  
  418.  
  419. $startdate = '2018-09-28'
  420.  
  421. $days = 5; 
  422.  
  423.    
  424.  
  425. $class = new work_days(); 
  426.  
  427. $_date_workday = $class->getNextWorkDate($startdate$days); 
  428.  
  429. echo $_date_workday;//2018-10-10

Tags: ThinkPHP指定日期

分享到: