我有以下代码,用于创建范围之间的日期列表。如果我提供一周中的某一天,它将获得该范围内的所有日期。如果我不这样做会一整天。
我的问题是,从10月24日到29日,它会返回额外的一天。我注意到之前我添加了额外的代码来获取一周中某一天的日期。
我认为问题就是array_push($ aryRange,date('Y-m-d',$ iDateFrom)); //第一个条目
function createDateRangeArray($strDateFrom,$strDateTo,$dateOfWeek=null) {
// takes two dates formatted as YYYY-MM-DD and creates an
// inclusive array of the dates between the from and to dates.
// could test validity of dates here but I'm already doing
// that in the main script
$aryRange=array();
$iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2),substr($strDateFrom,8,2),substr($strDateFrom,0,4));
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2),substr($strDateTo,8,2),substr($strDateTo,0,4));
if ($iDateTo>=$iDateFrom) {
if(!isset($dateOfWeek)) {
array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry
while ($iDateFrom<$iDateTo) {
$iDateFrom+=86400; // add 24 hours
array_push($aryRange,date('Y-m-d',$iDateFrom));
}
} else {
while ($iDateFrom<$iDateTo) {
if(date('w',$iDateFrom)==$dateOfWeek)
array_push($aryRange,date('Y-m-d',$iDateFrom));
$iDateFrom+=86400; // add 24 hours
}
}
}
if(count($aryRange)<1){
return false;
} else{
return $aryRange;
}
}
答案 0 :(得分:2)
使用strtotime()函数会不会更简单? http://php.net/manual/en/function.strtotime.php
$iDateFrom = strtotime("+1 day", $iDateFrom); // add 1 day
答案 1 :(得分:1)
您必须考虑daylight saving time
。
答案 2 :(得分:1)
你每次都要加24小时。这与添加一天并不完全相同。我强烈怀疑你是在10月23日或10月30日时钟回归的时区内进行操作,这会弄乱你的计算。
我并不完全清楚这里有什么最好的解决方案,但希望能够解释正在发生的事情将是一个良好的开端......
答案 3 :(得分:1)
快速&amp;肮脏的解决方案是为您比较的日期添加几个小时的时差。这样夏令时不会影响计算,足以将它们抛弃。
$iDateFrom=mktime(12,0,0,substr($strDateFrom,5,2),substr($strDateFrom,8,2),substr($strDateFrom,0,4));
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2),substr($strDateTo,8,2),substr($strDateTo,0,4));
更好的解决方案是使用实际日期操作功能,而不是手动添加24小时。