1

在我的脚本中,我有一个给定的结束日期。为了得到开始日期,我将结束日期减去 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() 有问题。提前致谢。

4

3 回答 3

1

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

例如,如果是 7 月 31 日,-1 monthstrtotime 是什么?

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
于 2013-09-06T15:15:17.207 回答
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--;
}
于 2013-09-06T15:25:33.260 回答
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;
?>

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

于 2013-09-06T15:47:22.273 回答