2011-11-07 51 views
1

我想在一个循环中重复一个月的固定次数。如果日期是有效日期,它只会回显日期,否则会跳过日期。 例如,如果“2012-02-30 10:10:00”正在循环中,它将被忽略并跳过,并且它将转到下一次迭代。在PHP中处理日期

下面的代码适用于start_date“2011-11-07 10:15:00”,但是当我将其更改为start_date,即“2011-11-30 10:15:00”它添加跳过一个迭代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 />"; 
} 
?> 

的评论起始日期预期结果如下:

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 
+0

您显示预期的结果,但是您得到的结果是什么?你可以发布吗? – DesignerGuy

+0

只需执行上面给出的脚本并解开注释的start_date并评论当前的start_date –

回答

0

当你调用

$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不会改变你的时间表。

0

试用下列:

// 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 />'; 
} 
0

这里是一个短的,值得信赖函数相呼应有效的datetime邮票:(如所期望/预期)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:00 
+0

@NikhilRao如果您认为这是列表中的最佳答案,请给它一个绿色的勾号,以便您的问题从未答复问题列表。如果有什么不对,请让我知道,我会调整它。 – mickmackusa