2015-10-05 112 views
0

我正在尝试创建日历,其中日期递增,并且每个日期都是可点击的,链接到搜索。奇怪的部分是日期停止在25th October,并停止递增。即24th, 25th, 25th, 25th...PHP日期递增错误

无论哪一天日历开始(一直盯着它几天),但在25th it stops incrementing。 。

感谢您的任何意见(后间隙的第二部分可能是无关紧要的,但包括它的情况下,有可能是任何一个环节)

for ($i = 1; $i <= 30; $i++){ 
    $date = date("d-m-Y", strtotime($date) + 86400); 
    array_push($array_date, $date); 
    $separatedate = explode('-', $date); 
    $getday = date("l", strtotime($date)); 
    print "<button class='submitsearch btn' value=$array_date[$i]>" . ltrim($separatedate[0], '0') . "<br>" . $getday . "<br></button>"; 

    if (!checkdate($separatedate[1] , $separatedate[0]+1 , $separatedate[2])) { 
     $nextmonth = date("F", strtotime($date) + 86400); 
     print "<strong>". $nextmonth . "</strong><hr/>"; 
    } 
} 

回答

3

这就是问题所在:

$date = date("d-m-Y", strtotime($date) + 86400); 

你似乎依靠这个来增加日期。通常情况下,这很好......但由于夏时制时间的变化,我们每天有25小时不是这样。

我建议您使用日期/时间算术函数(例如date_add),旨在添加一天而不是添加24小时。或者确保全部算术是在UTC中完成的,它不会有任何时区更改。一般来说,我会尽量避免执行比您真正需要的任何更多的字符串转换:以惯用方式保留代表日期/时间的变量,并对其执行算术运算 - 然后只需格式即可。如果你这样做,我认为没有必要在任何地方拨打strtotime

+1

或者只是使用'strtotime($ date。“+ 1 day”)' – Ben

+0

@BenPearlKahan:可能,但我通常会建议从混音中删除字符串转换时,他们不需要。像这样格式化和解析是一个非常糟糕的主意,IMO。 –

+0

谢谢Jon!和本贡献。给Jon指出问题的功劳。对于那些想知道实现的最终解决方案,我用创建一个新的DateTime对象替换了困扰的行:$ date = new DateTime($ date); $ date - >(new DateInterval('P1D'); $ date = $ date-> format('d-m-Y');用于与其他代码集成:) – lorry