PHP:strtotime()提供错误的输出

时间:2013-09-06 15:08:37

标签: php date datetime timestamp strtotime

在我的剧本中,我有一个给定的结束日期。为了获得开始日期,我将23个月减去结束日期。基本上,我的脚本应该做的是输出24个月(w / year) - 要打印的最后一个月/年应始终是指定的结束日期。

出于某种原因,我的脚本没有返回我想要的结果。给定$ end ='2013-07-05',脚本会正确返回结果。它打印出8月11日至7月13日,这是正确的。

但是对于某些日期(例如$ end ='2013-07-31'),输出错误。结果应该是9月11日到8月13日。但是在这种情况下,它输出8月11日到8月13日,这是完全错误的。

这是我的代码:

<?php
$end = strtotime('2013-07-31 +1 month');
$date = strtotime('2013-07-31 -23 month');
$start = $month = $date;
$months = "";
while($month < $end)
{
     $months .= date('M y', intval($month))." ";
     $month = strtotime("+1 month", intval($month));
}
echo $months;
?>

我认为strtotime()有问题。提前致谢。

3 个答案:

答案 0 :(得分:1)

您无法真正使用这样的月计算,尤其是在处理月末值时:

e.g。如果它是7月31日,那么-1 month对于strtotime来说是什么?

php > echo date('r', strtotime('2013-07-31 -1 month'));
Mon, 01 Jul 2013 00:00:00 -0600

人类可能会在6月30日选出,但strtotime不是人类。此操作适用于2月28日,通常是日值为<= 28的任何日期。一旦你进入29,30,31区域,你就会得到这些意想不到的结果

php > echo date('r', strtotime('2013-04-28 -1 month'));
Thu, 28 Mar 2013 00:00:00 -0600

答案 1 :(得分:0)

怎么样

$endMonth = '8';
$year = '2013';

$i = 24;
while( $i > 0 ){
    $month = ($endMonth - $i)%12;
    if( $month == 0 ){
        $year = $year - 1;
        $month = 12;
    }
    $months .= date('M y', strtotime($year.'-'.$month.'-02'));
    $i--;
}

答案 2 :(得分:0)

根据Marc B的回答,我修改了脚本以处理每个月的29,30,31。我所做的是,如果日期是29,30或31,它将被减去3天,以便日期将是28或更低,并且可以使用我当前的代码工作得很好。它对我有用,所以我想我现在就坚持这个。这是更新后的代码:

<?php
$dt = "2013-07-31";
$dy = strtotime($dt);
$day = date("d", $dy);

if (($day == 29) || ($day == 30) || ($day == 31)){
     $dt = strtotime("$dt -3 days");
     $dt = date('Y-m-d', $dt);
}

$end = strtotime("$dt +1 month");
$date = strtotime("$dt -23 month");
$start = $month = $date;
$months = "";
while($month < $end)
{
     $months .= date('M y', intval($month))." ";
     $month = strtotime("+1 month", intval($month));
}
echo $months;
?>

感谢您的帮助和见解。 :)