PHP的DateTime数组似乎有偏差

时间:2016-01-15 22:19:01

标签: php arrays datetime

我正在尝试创建一个函数来创建DateTime(s)数组。我想要的日期是某一年的每个星期六。

我有一个函数来执行此操作但是当值存储在数组中时,它们从一年的第二个星期六开始并延伸到下一年的第一个星期六。

请注意,下面显示了该函数生成的星期六列表,然后在几个空行后显示阵列中的星期六存储。

<?php
define ('sql','Y-m-d');
define ('br','<br/>');

function allSaturdays ($year){
    $endofyear = "$year-12-31";
    $interval = new DateInterval("P7D");

    $year--;
    $workingdate = "$year-12-31";  

    $workingdate  = strtotime ($workingdate);
    $workingdate  = strtotime ("next Saturday",$workingdate); 

    $workingdate  = date ("Y-m-d",$workingdate);   
    $workingdate  = new DateTime ($workingdate); 
    $result[] = new DateTime;
    while ($workingdate->format(sql) <= $endofyear ) {
       $result[] = $workingdate;
       echo $workingdate->format (sql).br;     
       $workingdate->add ($interval);
       $workingdate = new DateTime ($workingdate->format(sql));
       //echo $workingdate->format (sql)."#".br;;
    }// while
      unset ($workingdate);
      return $result;  

 }//function


  $sats = allSaturdays(2016);

  echo "<br/.<br/>";
  foreach ($sats as $saturday)
     echo $saturday->format(sql)."*<br>";


  ?>

但是,如果我只保存日期(2016-01-02),则数组中的值正确。

毫无疑问,我错过了一些简单的事情。任何帮助表示赞赏。

戴夫

1 个答案:

答案 0 :(得分:3)

将DateTime对象放入数组后,您正在修改它。

这是您将其添加到数组的位置:

$result[] = $workingdate;

之后的那一行增加了7天:

$workingdate->add($interval);

调用add会修改原始内容。如果您想确保自己正在处理副本,请先调用克隆或使用DateTimeImmutable代替DateTime

以下是使用DateTimeImmutable:

的代码的新版本
function allSaturdays ($year){

    $endOfYear = new DateTimeImmutable("$year-12-31");
    $workingdate = new DateTimeImmutable("first saturday of January " . $year);

    while ($workingdate <= $endofyear ) {
       $result[] = $workingdate;
       $workingDate = $workingDate->modify('+7 days');
    }// while
    return $result;  

 }//function

这是另一个不使用DateTimeImmutable

的版本
function allSaturdays ($year){

    $endOfYear = new DateTime("$year-12-31");
    $workingdate = new DateTime("first saturday of January " . $year);

    while ($workingdate <= $endofyear ) {
       $result[] = $workingdate;
       $workingDate = clone $workingDate;
       $workingDate->modify('+7 days');
    }// while
    return $result;  

 }//function