DateTime :: createFromFormat - проблема формата php - PullRequest
8 голосов
/ 12 августа 2010

PHP - DateTime :: createFromFormat - возвращает новый объект DateTime, отформатированный в соответствии с указанным форматом

, это работает:

$var = DateTime::createFromFormat('Ymd','20100809')->getTimestamp();

, но это не удается с

Вызов функции-члена getTimestamp () для необъекта

$var = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00')->getTimestamp();

Ответы [ 4 ]

15 голосов
/ 12 августа 2010

В данном случае часть M:S неверна. Это должно быть i:s. См. руководство по дате () .

Однако это подчеркивает более глубокую концептуальную проблему: неверный ввод в любом из параметров приведет к фатальной ошибке, что является плохим поведением для приложения в производстве.

Из руководства по createFromFormat:

Возвращает новый экземпляр DateTime или FALSE при ошибке.

Если при вызове не удается построить дату из вашего ввода, объект не возвращается.

Чтобы избежать фатальных ошибок при неправильных входных данных, вам (к сожалению, так как это нарушает правильную цепочку) сначала нужно проверить успешность:

 $var = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00');

 if ($var instanceof DateTime)
  echo $var->getTimestamp();
8 голосов
/ 12 августа 2010

Это должно быть

DateTime::createFromFormat('Y/m/d H:i:s','2010/08/09 07:47:00')->getTimestamp()
                                    ^ ^

См. date для используемого формата.

Вы также можете использовать strtotime в этом случае.Это даст тот же результат:

strtotime('2010/08/09 07:47:00')

Другой способ:

date_create('2010/08/09 07:47:00')->getTimestamp()

Обратите внимание, что DateTime::createFromFormat возвращает FALSE при ошибке.Вы можете получить ошибки с помощью DateTime::getLastErrors():

<?php
$d = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00');
var_dump($d);
var_dump(DateTime::getLastErrors());

даст:

bool(false)
array(4) {
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(3)
  ["errors"]=>
  array(1) {
    [14]=>
    string(13) "Trailing data"
  }
}
0 голосов
/ 12 августа 2010

H: M: S M - короткое имя месяца, а S - порядковый (st, nd, rd, th) день месяца, попробуйте H: i: s

0 голосов
/ 12 августа 2010

Используйте с вместо S и m вместо M

  • с -Секунды с ведущими нулями
  • S - английский порядковый суффикс дня месяца, 2 знака, такие как st, nd, rd или th

и

  • m - Числовое представление
    месяца, с ведущими нулями
  • M - короткое текстовое представление месяца, три буквы от января до декабря
...