2012-06-07 2 views
3

Я пытаюсь изменить объект DateTime в функции передается в качестве ссылки:PHP 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); 
} 
?> 

Но результат не как ожидалось. У меня что-то не так с этим материалом?

EDIT: Ожидаемый результат: 2012-03-15 2012-04-15 ...

Результат с функцией выше: 2012-03-01 2012-04-01 .. .

+2

Каков ваш результат/ожидаемый результат? – Nick

+0

Я думаю, проблема заключается в том, что результаты всегда показывают первый месяц. Похоже, что код должен установить дату в первый из следующего месяца, а затем установить дату на 15-й. Но когда вы выводите дату, это первый, а не 15-й. Похоже, как только вы используете относительный оператор «первый день следующего месяца», то он начинается с первой. Вы не можете изменить дату с помощью setDate. Вы можете изменить месяц/год, но не дату. – Recognizer

+1

Мне кажется, что 'DateTime :: setDate' не работает после того, как дата уже установлена. Кажется, что это нигде не документировано, и, похоже, он не работает. Странный. – lonesomeday

ответ

2

Мой PHP не понравился «первый день гнездового месяца», но работал с «+1 месяцем». Поскольку вы настраиваете день абсолютно, я бы не стал беспокоиться об этом, не будучи первым. Или, если это необходимо, вы можете установить его на первое, прежде чем перейти в цикл.

Итак, это сработало для меня. Я добавил new DateTimeZone('America/New_York'), так что это перестало бы бить меня о том, что он не установлен (общий сервер.) И удалил бит pass by reference (&), так как все объекты передаются по ссылке по умолчанию в 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); 
    } 
?> 
+0

Кажется, что «первый день следующего месяца» является проблемой. Странный. Изменение его на +1 месяц в моем коде приводит к получению правильного результата. В этом есть недостаток: добавление одного месяца к 2012-01-31 приводит к 2012-03-02. Поэтому результатом функции будет 2012-03-15 вместо 2012-02-15. Но он будет работать с вызовом функции setDate один раз с днем ​​= 1, добавив 1 месяц, а затем снова вызовите функцию setDate с 15. – Fabian

2

Вы уже передали ссылку на объект DateTime. Нет необходимости передавать экземпляр DateTime неявно в качестве ссылки. Если вам нужна копия объекта DateTime, вам нужно будет использовать ключевое слово clone.

В результате он выполняет итерацию более 15-го числа каждого последовательного месяца, который, читая код, я ожидал, что это будет результат.

Смежные вопросы