2016-11-11 7 views
0

Я извлекаю datetime в БД из разных столбцов на основе некоторых условий.php datetime output issue

Сценарий в PHP:

if($obj->acct_status == 2) 
    $dt = date('d M, Y h:i:s A', strtotime($obj->approve_datetime)); 

if($obj->acct_status == 4) 
    $dt = date('d M, Y h:i:s A', strtotime($obj->suspend_datetime)); 

хранит DB datetime в этом формате:

2016-11-11 14:26:03 

Выход:

30 Nov, -0001 12:00:00 AM 

Что является причиной этой проблемы?

+0

см. Этот http://php.net/manual/en/function.date.php#refsect1-function.date-parameters – Karthi

+0

его, потому что различный формат по умолчанию между базой данных и sql –

ответ

4

Я твердо верю, чтоследует избегать, когда имеется формат.

$from_format = 'Y-m-d H:i:s'; 
$to_format = 'd M, Y h:i:s A'; 
$date = '2016-11-11 14:26:03';   


echo DateTime::createFromFormat($from_format, $date)->format($to_format); 

Выходы:

11 Nov, 2016 02:26:03 PM 

Почему ваш код не я не могу сказать наверняка, что работает отлично здесь, но вы можете диагностировать немного. Я предполагаю в вашем случае, потому что strtotime() не удалось преобразовать, возвращая -62169984000, что на самом деле 0000-00-00 00:00:00, но из-за секунды, минуты, дня и месяца, которые не разрешены быть 0, происходят расчеты, приводящие к 0000-00-00 00:00:00 минус 1 день и 1 месяц , и т. д. 30 Nov -0001 12:00:00, так что, похоже, ваш $obj->suspend_datetime не содержит правильных данных.


Я написал 2 маленьких функций, чтобы поделиться, что бы сделать все это испытание легче обращаться:

function strtodatetime($date, $format = 'Y-m-d H:i:s'){ 
    return ($d = DateTime::createFromFormat($format, $date)) && $d->format($format) == $date ? $d : false; 
} 

function strtounixtime($date, $format = 'Y-m-d H:i:s'){ 
    return ($d = DateTime::createFromFormat($format, $date)) && $d->format($format) == $date ? $d->getTimestamp() : 0; 
} 

echo ($dt = strtodatetime($date)) ? $dt->format($to_format) : 'invalid format'; 
echo date('d M, Y h:i:s A', strtounixtime($obj->approve_datetime)); 

В вашем сценарии, используя strtounixtime() (лучше strtotime()) было бы перевести обратно в unix epoch, если он терпит неудачу.

+0

Пожалуйста, объясните, почему @nanny boy code is not –

+0

Может иметь много причин, ваш код действительно работает здесь. Я предполагаю, что 'strtotime()' терпит неудачу в вашем случае. Попробуйте повторить его целое число и используйте [this] (http://www.unixtimestamp.com/index.php), чтобы проверить, соответствует ли его правильная дата. – Xorifelse

+0

Его хороший подход, но если вы меняете дату с '$ date = '0000-00-00 00: 00: 00';' Вы получите тот же результат, что и упомянутый выше вопрос, так зачем использовать это? –