2012-04-12 13 views
6

Witam Mam problem z uzyskaniem metody datetime do pracy zgodnie z oczekiwaniami? Może robię coś nie tak?php DateTime createFromFormat function

// Passes OK 
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012'); 
var_dump($dateTime); 

// should fail but returns - 2016-09-25 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
var_dump($dateTime); 

// correctly returns False 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail'); 
var_dump($dateTime); 

// should fail but returns 2019-08-29 09:58:10 
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012'); 
var_dump($dateTime); 

enter image description here

Odpowiedz

30

Rzecz o DateTime::createFromFormat to, że istnieje dwa rodzaje niespodziewanego wejścia to ujmuje: rodzaju, który generuje błędy i rodzaju, który generuje ostrzeżenia.

Dane wejściowe, takie jak '56/56/fail', powodują błąd, więc zwracana jest false i wszystko jest w porządku. Jednakże, '56/56/2012' nie daje błędu, ale jest ostrzeżeniem i jest w rzeczywistości przetwarzany jako 56. dzień 56. miesiąca 2012. Od 2012 roku nie ma 56 miesięcy, PHP wewnętrznie zmienia to na 2016 + 8 miesięcy = sierpień 2016. A od tego czasu miesiąc nie ma 56 dni, mamy kolejną rekompensatę do września 2016 + (56 - 31) dni = 25 września 2016 r. Tak więc, choć nieoczekiwane, jest to w rzeczywistości poprawne.

Jeśli chcesz zabronić tej automatycznej regulacji, trzeba zawinąć metodę DateTime fabryki i użyć DateTime::getLastErrors jako odniesienie:

$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
$errors = DateTime::getLastErrors(); 
if (!empty($errors['warning_count'])) { 
    echo "Strictly speaking, that date was invalid!\n"; 
} 

See it in action.

+0

Dzięki za odpowiedź. Było 100% na miejscu i bardzo dobrze wyjaśnione. –

+0

Na czeku być gotowy do kopiuj/wklej go powinny mieć wstępną kontrolę, a także: if (! $ DateTime || empty ($ błędów [ 'warning_count'])) { :) –

1

Właściwie to jest poprawne: Na przykład, jeśli tworzysz randkę z 2012/04/31 (nieprawidłowy data) PHP zwraca 01.05.2012 (pierwszy dzień maja)!

Odbywa się to za kulisami

1

PHP jest dziwną bestią (co najmniej). 56/56/2012 powoduje dodanie wszystkich dodatkowych miesięcy i dni do daty, aż stanie się poprawna (bóg zna tylko logikę stojącą za tym).

+1

podejrzewam Logika polega na tym, że umożliwia programistom wykonywanie leniwych dat. Jeśli chcesz dodać coś na 90 dni lub 18 miesięcy, możesz po prostu zablokować numery bez wykonywania kalkulacji, owijając miesiące/lata samodzielnie, itd., A PHP załatwi to dla ciebie i zwróci ci to, co chcesz. –

Powiązane problemy