我尝试在一个循环中以固定的次数重复一个月的日期。如果日期是有效日期,它将仅回显日期,否则将跳过该日期。例如,如果"2012-02-30 10:10:00“出现在循环中,它将被忽略并跳过,并继续进行下一次迭代。
以下代码适用于start_date "2011-11-07 10:15:00“,但当我将其更改为注释为"2011-11-30 10:15:00”的start_date时,它会在跳过一次迭代后24小时添加。
我不确定我错在哪里。
<?php
//$start_date = "2011-11-30 10:15:00";
$start_date = "2011-11-07 10:15:00";
$no_of_repeat = 15;
$repeat_timing = 0;
for($x=0; $x<$no_of_repeat; $x++) {
$start_date = date('Y-m-d G:i:s',(strtotime($start_date) + ($repeat_timing)));
if(date("m",strtotime($start_date)) != 12) {
$next_month = date('m',strtotime($start_date)) + 1;
$year = date('Y',strtotime($start_date));
} else {
$next_month = 1 ;
$year = date('Y',strtotime($start_date)) + 1;
}
$day = date("d",strtotime($start_date));
$next_date =
$year."-".
$next_month."-".
$day." ".
date("G",strtotime($start_date)).":".
date("i",strtotime($start_date)).":".
date("s",strtotime($start_date));
if(checkdate($next_month,$day,$year))
$repeat_timing = strtotime($next_date) - strtotime($start_date);
else
continue;
echo $next_date."<br />";
}
?>注释的start_date的预期结果如下:
2011-12-30 10:15:00
2012-1-30 10:15:00
2012-3-30 10:15:00
2012-4-30 10:15:00
2012-5-30 10:15:00
2012-6-30 10:15:00
2012-7-30 10:15:00
2012-8-30 10:15:00
2012-9-30 10:15:00
2012-10-30 10:15:00
2012-11-30 10:15:00
2012-12-30 10:15:00
2013-1-30 10:15:00发布于 2011-11-07 15:56:57
当你调用
$start_date = date('Y-m-d G:i:s',(strtotime($start_date) + ($repeat_timing)));它在日期上增加了1个月,但也补偿了repeat_timing变量。您将在2011年1月30日的日期上添加2678400秒,这大约相当于2011年3月1日。
您最好将月、日和年与日期变量分开,并手动进行计算。这将防止DATE更改您的时间范围。
发布于 2011-11-08 03:17:22
尝试以下操作:
// starting variables
$startDate = "2011-11-30";
$time = '10:15:00';
$numberOfTimesToRepeat = 10;
// Set our counts to 0
$count = 0;
$datesFound = 0;
// parse date
list($startYear,$startMonth,$startDay) = explode('-',$startDate);
// Create an array
while ($datesFound < $numberOfTimesToRepeat) {
// Calculate number of months to add
$monthsToAdd = fmod($count,12);
// Calculate new month number
$newMonth = (($startMonth + $monthsToAdd) > 12) ? ($startMonth + $monthsToAdd - 12) : ($startMonth + $monthsToAdd);
// Add the leading 0 if necessary
if ($newMonth < 10 && strlen($newMonth) < 2) $newMonth = '0'.$newMonth;
// Calculate number of months to add
$yearsToAdd = floor(($count/12));
$newYear = $startYear + $yearsToAdd;
if (checkdate($newMonth,$startDay,$newYear)) {
$dates[] = $newYear.'-'.$newMonth.'-'.$startDay.' '.$time;
$datesFound++;
}
// increase our count either way
$count++;
}
// Show the dates
foreach ($dates as $date) {
echo $date.'<br />';
}发布于 2017-03-23 20:17:24
下面是一个简短的、值得信任的函数,它回显有效的日期时间戳:online demo
function getValidDateTimes($date,$iterations){
if(preg_match("/(\d{4})-(\d{1,2})-(\d{2}) (.*)/",$date,$n)){ // capture datetime bits
list(,$Y,$n,$d,$time)=$n; // declare bits as variables for readability
for(++$n,$x=0; $x<$iterations; ++$x,++$n){ // start with month after $start_date
$n=($n>12?"1":$n); // reset to 1 when month exceeds 12
$date="$Y-$n-$d"; // build literal new date
if($date==date("Y-n-d",strtotime($date))){ // built date versus assumed date
echo "$date $time<br>"; // store valid date with concatenated time
}
}
}
}
$start_date="2011-11-30 10:15:00";
$iterations=15;
getValidDateTimes($start_date,$iterations);输出(如所需/预期):
2011-12-30 10:15:00
2011-1-30 10:15:00
2011-3-30 10:15:00
2011-4-30 10:15:00
2011-5-30 10:15:00
2011-6-30 10:15:00
2011-7-30 10:15:00
2011-8-30 10:15:00
2011-9-30 10:15:00
2011-10-30 10:15:00
2011-11-30 10:15:00
2011-12-30 10:15:00
2011-1-30 10:15:00https://stackoverflow.com/questions/8033765
复制相似问题