백엔드 개발 PHP 튜토리얼 ThinkPHP에서 특정 날짜 이후의 영업일의 특정 날짜를 구하는 방법(자세한 코드 설명)

ThinkPHP에서 특정 날짜 이후의 영업일의 특정 날짜를 구하는 방법(자세한 코드 설명)

Oct 13, 2018 pm 03:00 PM
php

이 글의 내용은 ThinkPHP에서 특정 날짜 이후의 특정 날짜를 구하는 방법에 관한 것입니다. (자세한 코드 설명) 도움이 필요한 친구들이 참고하면 좋겠습니다. 당신에게.

아이디어:

1. 쿼리 연도의 모든 근무일에 대한 데이터 배열을 가져옵니다
2. 근무일에 대한 쿼리 시작 날짜의 인덱스를 가져옵니다
3. 쿼리할 날짜의 인덱스를 계산합니다. 쿼리 날짜 가져오기

/*创建日期类型记录表格*/
CREATE TABLE `tb_workday` (
`did` int(11) NOT NULL AUTO_INCREMENT,
`exact_date` varchar(32) NOT NULL COMMENT '具体日期:格式date("Ymd");(20170205)',
`date_year` varchar(32) NOT NULL COMMENT '具体日期:格式date("Y");(2017)',
`date_type` tinyint(2) NOT NULL COMMENT '日期类型:0、工作日;1、特殊工作日;2、法定节假日',
PRIMARY KEY (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=829 DEFAULT CHARSET=utf8 COMMENT='各年工作日&法定节假日数据'
로그인 후 복사
<?php

class work_days
{
  /**
   * 获取星期
   * @param $date
   * @return mixed
   */
  function get_week($date)
  {
    //强制转换日期格式
    $date_str = date('Y-m-d', strtotime($date));
    //封装成数组
    $arr = explode("-", $date_str);
    //参数赋值
    //年
    $year = $arr[0];
    //月,输出2位整型,不够2位右对齐
    $month = sprintf('%02d', $arr[1]);
    //日,输出2位整型,不够2位右对齐
    $day = sprintf('%02d', $arr[2]);
    //时分秒默认赋值为0;
    $hour = $minute = $second = 0;
    //转换成时间戳
    $strap = mktime($hour, $minute, $second, $month, $day, $year);
    //获取数字型星期几
    $number_wk = date("w", $strap);

    //获取数字对应的星期
    return $number_wk;

    //自定义星期数组
    //$weekArr = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");

    //获取数字对应的星期
    //return $weekArr[$number_wk];
  }


  /**
   * 获取指定日期段内每一天的日期
   * @param  string $startdate 开始日期
   * @param  string $enddate   结束日期
   * @return array
   */
  function getDateFromRange($startdate, $enddate)
  {
    $stimestamp = strtotime($startdate);
    $etimestamp = strtotime($enddate);

    // 计算日期段内有多少天
    $days = ($etimestamp - $stimestamp) / 86400 + 1;

    // 保存每天日期
    $_list_date = array();
    for ($i = 0; $i < $days; $i++) {
      $_list_date[] = date('Y-m-d', $stimestamp + (86400 * $i));
    }
    return $_list_date;
  }

  function curl_post($url, $data = null)
  {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)) {
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
  }

  /**
   * 更新数据库指定年份日期数据
   * @param $year
   * @return int
   */
  function updateDate($year)
  {
    $startDate = date('Y-m-d', strtotime($year . '-01-01'));
    $endDate = date('Y-m-d', strtotime('+1 year', strtotime($startDate)) - 86400);
    $_list_date = self::getDateFromRange($startDate, $endDate);

    $url = 'http://api.goseek.cn/Tools/holiday';//自行查找的免费API

    $m = M('tb_workday');
    $count = 0;

    foreach ($_list_date as $k => $_date) {
      $_ret = 0;
      $_date = date('Ymd', strtotime($_date));
      $_post_data = array('date' => $_date);
      $_ret_curl = curl_post($url, $_post_data);
      $_ret_curl = json_decode($_ret_curl, true);

      //工作日
      if ($_ret_curl['data'] == 0) {
        $dateData['exact_date'] = $_date;
        $dateData['date_year'] = $year;
        $dateData['date_type'] = 0;
        $_ret = $m->add($dateData) ? 1 : 0;
        unset($dateData);


        //工作日 判断是否为周末
        if (in_array(self::get_week($_date), array(0, 1))) {
          //特殊工作日
          $dateData['exact_date'] = $_date;
          $dateData['date_year'] = $year;
          $dateData['date_type'] = 1;
          $_ret = $m->add($dateData) ? 1 : 0;
          unset($dateData);
        }
      }

      //法定节假日
      if ($_ret_curl['data'] == 2) {
        $dateData['exact_date'] = $_date;
        $dateData['date_year'] = $year;
        $dateData['date_type'] = 2;
        $_ret = $m->add($dateData) ? 1 : 0;
        unset($dateData);
      }

      //休息日(周末) 暂不处理
      /*if ($_ret_curl['data'] == 1) {

      }*/
      $_ret && $count++;
      unset($_date, $_post_data, $_ret_curl, $_ret);
    }
    return $count;
  }

  /**
   * 获取当年所有工作日 (从数据库获取,数据库无数据则先更新数据)
   * @param string $year 当年年份
   * @return array
   */
  private function getWorkDays($year)
  {
    $m = M('tb_workday');
    $map['date_year'] = $year;
    $map['date_type'] = 0;
    $DateArray = $m->field('exact_date')->where($map)->select();
    if (!empty($DateArray)) {
      $DateArray = array_column($DateArray, 'exact_date');
      return $DateArray;
    } else {
      //更新数据库工作日数据
      $ret = self::updateDate($year);
      if ($ret > 0) {
        return self::getWorkDays($year);
      } else {
        return false;
      }
    }
  }

  /**
   * 获取开始日期后第N个工作日具体日期
   * @param $startdate string 计算开始日期  需包含年月日信息
   * @param $days      int 间隔天数
   * @return mixed 成功返回 对应日期,失败返回false
   */
  public function getNextWorkDate($startdate, $days)
  {
    $year = date('Y', strtotime($startdate));
    $startdate = date('Y-m-d', strtotime($startdate));

    $workDays = $this->getWorkDays($year);

    $search_key = array_search(date('Ymd', strtotime($startdate)), $workDays);

    if ($search_key === false) {//查询日期为非工作
      //获取查询日期前最近工作日
      $m = M('tb_workday');
      $map['date_year'] = $year;
      $map['date_type'] = 0;
      $map['DATE_FORMAT(`exact_date`,\'%Y-%m-%d\')'] = array('LT', $startdate);
      $_search_date = $m->where($map)->order('`exact_date` DESC')->getField('exact_date');
      $search_key = array_search($_search_date, $workDays);
      unset($m, $map, $_search_date);
    }

    $t_key = $search_key + $days;

    if ($t_key <= count($workDays) - 1) {
      return date('Y-m-d', strtotime($workDays[$t_key]));
    } else {
      //查询日期已跨年
      $n_days = $days - (count($workDays) - 1 - $search_key);
      $next_year = $year + 1;
      return $this->getNextWorkDate($next_year . '-01-01', $n_days - 1);
    }
  }
}


$startdate = '2018-09-28';
$days = 5;

$class = new work_days();
$_date_workday = $class->getNextWorkDate($startdate, $days);
echo $_date_workday;//2018-10-10
로그인 후 복사

위 내용은 ThinkPHP에서 특정 날짜 이후의 영업일의 특정 날짜를 구하는 방법(자세한 코드 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

CakePHP 날짜 및 시간

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

CakePHP 프로젝트 구성

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

CakePHP 파일 업로드

CakePHP 라우팅 CakePHP 라우팅 Sep 10, 2024 pm 05:25 PM

CakePHP 라우팅

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP 토론

CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

CakePHP 빠른 가이드

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법

See all articles