php获取指定日期之间的各个周和月的起止时间
根据指定的前后两个日期,计算这两个日期之间各个周的起始时间和结束时间,以及各个月的起始时间和结束时间
日志格式化类Date.class.php
<?php
classDatefmt{
function__construct(){}
/**
*根据指定日期获取所在周的起始时间和结束时间
*/
publicfunctionget_weekinfo_by_date($date){
$idx=strftime("%u",strtotime($date));
$mon_idx=$idx-1;
$sun_idx=$idx-7;
returnarray(
'week_start_day'=>strftime('%Y-%m-%d',strtotime($date)-$mon_idx*86400),
'week_end_day'=>strftime('%Y-%m-%d',strtotime($date)-$sun_idx*86400),
);
}
/**
*根据指定日期获取所在月的起始时间和结束时间
*/
publicfunctionget_monthinfo_by_date($date){
$ret=array();
$timestamp=strtotime($date);
$mdays=date('t',$timestamp);
returnarray(
'month_start_day'=>date('Y-m-1',$timestamp),
'month_end_day'=>date('Y-m-'.$mdays,$timestamp)
);
}
/**
*获取指定日期之间的各个周
*/
publicfunctionget_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;
}
/**
*获取指定日期之间的各个月
*/
publicfunctionget_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.'+1month'));
}while($end_day<$edate);
return$range_arr;
}
/**
*截取日期中的月份和日
*@paramstring$date
*@returnstring$date
*/
publicfunctionsubstr_date($date){
if(!$date)returnFALSE;
returndate('m-d',strtotime($date));
}
/**
*检查日期的有效性YYYY-mm-dd
*@paramarray$date_arr
*@returnboolean
*/
publicfunctioncheck_date($date_arr){
$invalid_date_arr=array();
foreach($date_arras$row){
$timestamp=strtotime($row);
$standard=date('Y-m-d',$timestamp);
if($standard!=$row)$invalid_date_arr[]=$row;
}
if(!empty($invalid_date_arr)){
die("invaliddate->".print_r($invalid_date_arr,TRUE));
}
}
}
类文件的使用
<?php
require_once"Datefmt.class.php";
$datefmt=newDatefmt();
//输出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"
}
*/