我正在尝试创建一个函数来创建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),则数组中的值正确。
毫无疑问,我错过了一些简单的事情。任何帮助表示赞赏。
戴夫
答案 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