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

Tags: ThinkPHP指定日期

分享到: