2010-08-12 6 views
8

PHP - DateTime :: createFromFormat - zwraca nowy obiekt DateTime sformatowane według określonego formatuDateTime :: createFromFormat - php Format problem

to działa:

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

ale to się nie powiedzie z

Zadzwoń do funkcji członkowskiej getTimestamp() na obiekcie niebędącym obiektem:

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

Odpowiedz

14

W tym przypadku część M:S jest nieprawidłowa. Musi to być i:s. Zobacz manual on date().

Podkreśla to jednak głębszy problem koncepcyjny: niepoprawny wpis w którymkolwiek z parametrów spowoduje błąd krytyczny, co jest złym zachowaniem dla aplikacji w produkcji.

z podręcznika na createFromFormat:

Zwraca nową instancję DateTime lub FALSE w przypadku błędu.

Gdy połączenie nie może utworzyć daty z wprowadzonych danych, żaden obiekt nie jest zwracany.

Aby uniknąć fatalnych błędów na błędnych wejść, to będzie (niestety, jak to łamie piękny łańcuchowym) trzeba sprawdzić na sukces pierwszy:

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

if ($var instanceof DateTime) 
    echo $var->getTimestamp(); 
+1

Nie 'm: s'; 'i: s'. 'm' jest dla ćmy. – Artefacto

+0

@ Armourfakto oczywiście, okrzyki. Poprawione. –

0

Zastosowanie s zamiast S i m zamiast m

  • S - sekundy z zer wiodących
  • S - angielski porządkowej przyrostkiem dzień miesiąca, 2 znaki jak st, Nd, Rd lub p

i

  • M - reprezentacja cyfrowa liczba
    miesiąca z zerami wiodącymi
  • M - krótka reprezentacja tekstowa z miesiąca, trzy litery takie jak Jan do Dec
0

H: M: S M miesięcy skrócona nazwa i S porządkowa (st, nd, rd, th) dni od miesięcy try H: i: s

7

Należy

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

Patrz format date dla używanego formatu.W takich okolicznościach można również użyć strtotime. Dałoby to ten sam wynik:

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

inny sposób:

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

pamiętać, że DateTime::createFromFormat powraca FALSE błędu. Można pobrać błędy z 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()); 

dałby:

 
bool(false) 
array(4) { 
    ["warning_count"]=> 
    int(0) 
    ["warnings"]=> 
    array(0) { 
    } 
    ["error_count"]=> 
    int(3) 
    ["errors"]=> 
    array(1) { 
    [14]=> 
    string(13) "Trailing data" 
    } 
}