DateTime::createFromFormat - проблема с форматом php

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();

person roger rover    schedule 12.08.2010    source источник


Ответы (4)


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

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

Из руководства по 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();
person Pekka    schedule 12.08.2010
comment
Не m:s; i:s. m для моли. - person Artefacto; 12.08.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"
  }
}
person Artefacto    schedule 12.08.2010
comment
спасибо за DateTime::getLastErrors(), очень полезно.. - person fudu; 14.12.2020

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

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

и

  • m — числовое представление
    месяца с ведущими нулями.
  • M - краткое текстовое представление месяца, три буквы, например, с января по декабрь.
person codaddict    schedule 12.08.2010

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

person Mark Baker    schedule 12.08.2010