在我的剧本中,我有一个给定的结束日期。为了获得开始日期,我将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()有问题。提前致谢。
答案 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;
?>
感谢您的帮助和见解。 :)