在PHP函数中计算日期时出错

时间:2015-08-07 13:54:35

标签: php strtotime

我正在开发一个php项目,我需要从特定日期获取接下来20周的所有日期,我正在尝试遵循逻辑

$epochdate = strtotime("17 August 2015");

for ($i=$epochdate + 604800, $i < $epochdate + ( 604800 * 20 ); $i = $i+604800, $j++) { 
   echo date('Y-m-d H:i:s', $i);
   echo '</br>';
}

一切正常,但在2015-10-19之后给出了错误的日期..这是输出

2015-08-24 00:00:00
2015-08-31 00:00:00
2015-09-07 00:00:00
2015-09-14 00:00:00
2015-09-21 00:00:00
2015-09-28 00:00:00
2015-10-05 00:00:00
2015-10-12 00:00:00
2015-10-19 00:00:00
2015-10-25 23:00:00//it should be 2015-10-26
2015-11-01 23:00:00
2015-11-08 23:00:00
2015-11-15 23:00:00
2015-11-22 23:00:00
2015-11-29 23:00:00
2015-12-06 23:00:00
2015-12-13 23:00:00
2015-12-20 23:00:00
2015-12-27 23:00:00

这里有什么问题?

2 个答案:

答案 0 :(得分:5)

这很可能是因为在某些时区从标准时间过渡到白昼时间。

请尝试使用DateTime类:

$epochdate = new DateTime("2015-08-17");
for ($i = 0; $i < 20; $i++) {
  $epochdate->modify('+1 week');
  echo $epochdate->format('Y-m-d H:i-s') . '<br>';
}

输出:

2015-08-24 00:00-00
2015-08-31 00:00-00
2015-09-07 00:00-00
2015-09-14 00:00-00
2015-09-21 00:00-00
2015-09-28 00:00-00
2015-10-05 00:00-00
2015-10-12 00:00-00
2015-10-19 00:00-00
2015-10-26 00:00-00
2015-11-02 00:00-00
2015-11-09 00:00-00
2015-11-16 00:00-00
2015-11-23 00:00-00
2015-11-30 00:00-00
2015-12-07 00:00-00
2015-12-14 00:00-00
2015-12-21 00:00-00
2015-12-28 00:00-00
2016-01-04 00:00-00

如果日期采用日期年份格式,则可能需要先使用DateTime::createFromFormat()

答案 1 :(得分:3)

你为什么这么复杂?

对于使用strtotime()的逻辑,你可以这样做

 <?php
    $epochdate = "17 August 2015"; 
    for ($i=0; $i<=20; $i++) {
       echo date('Y-m-d H:i', strtotime($epochdate.' +'.$i.' weeks');
       echo "<br>";

    }