根据指定的前后两个日期,计算这两个日期之间各个周的起始时间和结束时间,以及各个月的起始时间和结束时间
日志格式化类 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" } */