2011-01-16 5 views
1

Я пытаюсь преобразовать дату в объект DateTime. Мой код отлично работает на моем localhost (php version 5.3), но возвращает пустой объект DateTime на моем удаленном сервере (php version 5.2.14). Я пропустил что-то действительно очевидное?Объект DateTime пустой

<?php 
    $d = '2010-01-01'; 
    $n = new DateTime ($d); 
    print_r($n); 
?> 

// результат на локальном хосте:

DateTime Object ([date] => 2010-01-01 00:00:00 [timezone_type] => 3 [timezone] => UTC) 

// результат на RemoteHost:

DateTime Object () // is blank 

ОБНОВЛЕНО Пример ::

Может быть, я что-то на самом деле просто не хватает. Я пробовал ж/предложение от Pooyan, но я должен быть плотным:

function changeDate (){ 

$arr = array('2010-01-01' , '2010-01-02' , '2010-01-03'); 

foreach ($arr as $k=>$v){ 
    $v = new DateTime ($v); 
    $v->format('Y-m-d'); 
    $arr[$k] = $v; 
} 

return $arr; 

} 

print_r(changeDate()); // works in php 5.3 but still returns a blank DateTime Object in php 5.2 
+0

вы не должны вызывать date_default_timezone_set несколько раз. Он устанавливает часовой пояс по умолчанию для всех функций в скрипте ... – Paul

+0

Что содержит '$ value [" date "]'? –

+0

Вы могли бы указать примерные даты и как вы проверяете значение datetime впоследствии? Т.е. он может быть реплицирован. – Hamish

ответ

0

$v->format('Y-m-d') не изменяет объект, но возвращает строку с DateTime, отформатированный в данном формате.

Так это должно работать:

function changeDate() { 
    $input = array('2010-01-01' , '2010-01-02' , '2010-01-03'); 

    foreach($input as $v) { 
     $date = new DateTime($v); 
     $output[] = $date->format('Y-m-d'); 
    } 

    return $output; 
} 

print_r(changeDate()); 

Хотя это дает массив входной назад, так что это довольно бессмысленно.

-1

вы должны знать, что есть метод, называемый getLastErrors(), который будет проводить какую-либо ошибку, созданную с помощью DateTime

попробуйте следующее :

foreach ($rows as $key => $value) 
{ 
    if(isset($value['date'])) 
    { 
     try 
     { 
      $rows[$key]['date'] = new DateTime($value['date']); 
      if(count(($e = $rows[$key]['date']->getLastErrors())) > 0) 
      { 
        throw new Exception($e[0]); 
      } 
     }catch(Exception $e) 
     { 
      echo "Error: " . $e->getMessage(); 
      continue; 
     } 
     date_default_timezone_set('America/New_York'); 
    } 
} 

и посмотреть, если это пролит некоторый свет.

+0

Ну, проблема в том, что мне нужно, чтобы это работало под php 5.2, так как код работает на php 5.3, но не на 5.2 –

+0

Он говорит, что он не работает на PHP 5.2. DateTime :: getLastErrors() работает только на PHP> = 5.3 – Pere

2

с PHP 5.2 вы должны использовать:

$d = '2010-01-01'; 
$n = new DateTime ($d) 
echo $n->format('Y-m-d'); 
+0

См. Мой обновленный код выше w/your suggestion ... он все еще не работает, хотя –

0

Возможно, этот ответ приходит слишком поздно. У меня была такая же проблема, и проблема была в print_r, а не в объекте DateTime. Кажется, что print_r и/или var_dump в объектах DateTime на PHP 5.2 не работает. Таким образом, предложение об использовании

echo $n->format('Y-m-d'); // (1) 

вместо

Если (1) показывает ожидаемую величину, то ваш объект хорошо.

Вы можете найти более подробную информацию здесь: new DateTime returns empty DateTime instance

+0

Я не согласен с вами. В моем случае я уверен, что проблема заключается в 'DateTime' в 5.2 –

+0

@whiteletters и бланках, не могли бы вы подробнее рассказать об этом? В PHP 5.2.17 я уверен, что, по крайней мере, я получаю пустое содержимое при попытке print_r действительного объекта DateTime. – Pere

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