3

我正在尝试修改作为引用传递的函数中的 DateTime 对象:

<?php
$date = new DateTime('2012-02-12');

for($n1 = 0; $n1 < 10; $n1++) {
    $date->modify('first day of next month');
    setDate($date, 15);
    echo $date->format('Y-m-d') . "<br />\n";
}

function setDate(&$date, $day) {
    $date->setDate($date->format('Y'), $date->format('m'),  $day);
}
?>

但结果并不如预期。我对这些参考资料有什么问题吗?

编辑:预期结果:2012-03-15 2012-04-15 ...

上述功能的结果: 2012-03-01 2012-04-01 ...

4

2 回答 2

2

您已经传递了对 DateTime 对象的引用。无需隐式传递 DateTime 的实例作为参考。如果您需要 DateTime 对象的副本,则需要使用clone关键字。

就结果而言,它会在每个连续月份的 15 次以上进行迭代,阅读代码,我预计会是结果。

于 2012-06-07T15:49:51.793 回答
2

我的 PHP 不喜欢“巢月的第一天”位,但使用了“+1 月”。既然你绝对是在设定这一天,我不会担心它不是第一个。或者,如果需要,您可以在进入循环之前将其设置为第一个。

所以,这对我有用。我添加了它,new DateTimeZone('America/New_York')这样它就不会因为它没有被设置(共享服务器)而困扰我。并删除了通过引用传递(&)位,因为现在在 PHP 中默认情况下所有对象都是通过引用传递的。

<?php
    $date = new DateTime('2012-02-12',new DateTimeZone('America/New_York'));
    for($n1 = 0; $n1 < 10; $n1++) {
        $date->modify('+1 month');
        setDate($date, 15);
        echo $date->format('Y-m-d') . "<br />\n";
    }
    function setDate($date, $day) {
        $date->setDate($date->format('Y'), $date->format('m'),  $day);
    }
?>
于 2012-06-07T17:32:01.307 回答