php获取指定日期之间的各个周和月的起止时间

  根据指定的前后两个日期,计算这两个日期之间各个周的起始时间和结束时间,以及各个月的起始时间和结束时间

  日志格式化类 Date.class.php

  

复制代码 代码如下:

  <?php

  class Datefmt{

  function __construct() {}

  /**

  * 根据指定日期获取所在周的起始时间和结束时间

  */

  public function get_weekinfo_by_date($date) {

  $idx = strftime("%u", strtotime($date));

  $mon_idx = $idx - 1;

  $sun_idx = $idx - 7;

  return array(

  'week_start_day' => strftime('%Y-%m-%d', strtotime($date) - $mon_idx * 86400),

  'week_end_day' => strftime('%Y-%m-%d', strtotime($date) - $sun_idx * 86400),

  );

  }

  /**

  * 根据指定日期获取所在月的起始时间和结束时间

  */

  public function get_monthinfo_by_date($date){

  $ret = array();

  $timestamp = strtotime($date);

  $mdays = date('t', $timestamp);

  return array(

  'month_start_day' => date('Y-m-1', $timestamp),

  'month_end_day' => date('Y-m-'.$mdays, $timestamp)

  );

  }

  /**

  * 获取指定日期之间的各个周

  */

  public function get_weeks($sdate, $edate) {

  $range_arr = array();

  // 检查日期有效性

  $this->check_date(array($sdate, $edate));

  // 计算各个周的起始时间

  do {

  $weekinfo = $this->get_weekinfo_by_date($sdate);

  $end_day = $weekinfo['week_end_day'];

  $start = $this->substr_date($weekinfo['week_start_day']);

  $end = $this->substr_date($weekinfo['week_end_day']);

  $range = "{$start} ~ {$end}";

  $range_arr[] = $range;

  $sdate = date('Y-m-d', strtotime($sdate)+7*86400);

  }while($end_day < $edate);

  return $range_arr;

  }

  /**

  * 获取指定日期之间的各个月

  */

  public function get_months($sdate, $edate) {

  $range_arr = array();

  do {

  $monthinfo = $this->get_monthinfo_by_date($sdate);

  $end_day = $monthinfo['month_end_day'];

  $start = $this->substr_date($monthinfo['month_start_day']);

  $end = $this->substr_date($monthinfo['month_end_day']);

  $range = "{$start} ~ {$end}";

  $range_arr[] = $range;

  $sdate = date('Y-m-d', strtotime($sdate.'+1 month'));

  }while($end_day < $edate);

  return $range_arr;

  }

  /**

  * 截取日期中的月份和日

  * @param string $date

  * @return string $date

  */

  public function substr_date($date) {

  if ( ! $date) return FALSE;

  return date('m-d', strtotime($date));

  }

  /**

  * 检查日期的有效性 YYYY-mm-dd

  * @param array $date_arr

  * @return boolean

  */

  public function check_date($date_arr) {

  $invalid_date_arr = array();

  foreach ($date_arr as $row) {

  $timestamp = strtotime($row);

  $standard = date('Y-m-d', $timestamp);

  if ($standard != $row) $invalid_date_arr[] = $row;

  }

  if ( ! empty($invalid_date_arr)) {

  die("invalid date -> ".print_r($invalid_date_arr, TRUE));

  }

  }

  }

  类文件的使用

  

复制代码 代码如下:

  <?php

  require_once "Datefmt.class.php";

  $datefmt = new Datefmt();

  // 输出11月1日和30日之间的各周

  var_dump($datefmt->get_weeks('2014-11-05', '2014-11-29'));

  /*结果为

  array(4) {

  [0]=>

  string(13) "11-03 ~ 11-09"

  [1]=>

  string(13) "11-10 ~ 11-16"

  [2]=>

  string(13) "11-17 ~ 11-23"

  [3]=>

  string(13) "11-24 ~ 11-30"

  }

  */

  // 输出2月1日和11月30日

  var_dump($datefmt->get_months('2014-02-03', '2014-11-29'));

  /*结果为

  array(10) {

  [0]=>

  string(13) "02-01 ~ 02-28"

  [1]=>

  string(13) "03-01 ~ 03-31"

  [2]=>

  string(13) "04-01 ~ 04-30"

  [3]=>

  string(13) "05-01 ~ 05-31"

  [4]=>

  string(13) "06-01 ~ 06-30"

  [5]=>

  string(13) "07-01 ~ 07-31"

  [6]=>

  string(13) "08-01 ~ 08-31"

  [7]=>

  string(13) "09-01 ~ 09-30"

  [8]=>

  string(13) "10-01 ~ 10-31"

  [9]=>

  string(13) "11-01 ~ 11-30"

  }

  */