Класс PHP DateTime дает неожиданные результаты

Я привык к классу DateTime и получаю неожиданные результаты из приведенного ниже кода:

<?php  
  $now =  date("Y-m-d H:i:s");
  echo $now .'</br>';
  $newDate = date("Y-m-d H:i:s",strtotime("$now + 1 years"));
  $converted = strtotime("$newDate");
  $outputDate = new DateTime("@$converted");
  var_dump($outputDate);
  echo "Output - ". $outputDate->date;
?>

Когда у меня есть var_dump($outputDate), я получаю ожидаемый результат (т.е. строка вывода находится в конце):

2015-03-29 23:08:30
object(DateTime)#1 (3) { ["date"]=> string(26) "2016-03-29 21:08:30.000000"   
["timezone_type"]=> int(1) 
["timezone"]=> string(6) "+00:00" } Output - 2016-03-29 21:08:30.000000

Однако, когда у меня есть точно такой же код и комментарий var_dump($outputDate):

<?php  
  $now =  date("Y-m-d H:i:s");
  echo $now .'</br>';
  $newDate = date("Y-m-d H:i:s",strtotime("$now + 1 years"));
  $converted = strtotime("$newDate");
  $outputDate = new DateTime("@$converted");
  // var_dump($outputDate);
  echo "Output - ". $outputDate->date;
?>

Я просто получаю:

2015-03-29 23:14:13
Output -

Я не уверен, почему наличие строки var_dump($outputDate) позволяет мне выводить дату. Я решил проблему, используя другой подход, но мне любопытно, почему это так. Какие-либо предложения?


person underflow    schedule 29.03.2015    source источник
comment
Я уже написал ответ с объяснением, почему это происходит. Не могу опубликовать это, так как Q уже закрыт. В любом случае: github.com/php/php- src/blob/master/ext/date/php_date.c#L2163   -  person zerkms    schedule 30.03.2015


Ответы (1)


date не определено в документах класса Datetime, поэтому это поведение не определено и на такой код нельзя полагаться. Чтобы получить представление даты и времени в виде строки, вы должны использовать метод format() следующим образом:

echo "Output - ". $outputDate->format("Y-m-d H:i:s");
//or with procedural style
echo "Output - ". date_format($outputDate,"Y-m-d H:i:s");

Подробнее о возможных параметрах format можно прочитать в документах PHP.

person Paweł Tomkiel    schedule 29.03.2015
comment
@underflow - надеюсь, это помогло вам. Можете ли вы принять ответ на вопрос, закрытый как дубликат? - person Paweł Tomkiel; 30.03.2015
comment
О, как я вижу - можно :) - person Paweł Tomkiel; 30.03.2015
comment
да я могу, я не мог сразу, так как нужно было ждать определенное время. Теперь, чтобы выяснить, почему DateTime занимает несколько часов от исходной даты - person underflow; 30.03.2015
comment
Кроме того, вы не должны полагаться на свое значение $converted. Попробуйте создать свой объект DateTime, а затем используйте метод modify(), который может увеличить вашу дату на +1 years php .net/manual/en/datetime.modify.php - person Paweł Tomkiel; 30.03.2015