2012-04-12 7 views
6

こんにちは、datetimeメソッドが期待通りに動作するようになっているようですね。私は何か間違っているかもしれない?php DateTime createFromFormat functionality

// 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

答えて

30

の後ろに行われます。

'56/56/fail'などの入力はエラーを生成するので、falseが返され、すべてが良好です。ただし、'56/56/2012'はエラーではなく警告を示し、2012年第56月の56日目として実際に解析されます。2012年以降は56ヶ月間ではないため、PHPは内部的にこれを2016 + 8月= 2016年8月に変更します。月は56日ではなく、2016年9月+ 56-31日= 2016年9月25日に別の補償があります。予期しない間に、これは実際には正しいです。

あなたはこの自動調整を禁止したい場合は、DateTimeファクトリメソッドをラップし、リファレンスとしてDateTime::getLastErrorsを使用する必要があります。

$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

返信いただきありがとうございます。 100%のスポットがあり、とてもうまく説明されました。 は (!$ dateTimeの||空($エラー[「warning_count」]))場合は{ :) –

+0

は、同様に初期チェックを持っている必要があり、それをコピー/ペーストに備えますプログラマが怠惰な日付の計算をすることができます。もし何かに90日か18か月を追加したいのであれば、calcを使わずにそこにある数字を詰め込み、月/年をあなた自身でラップすることができます。PHPはあなたのためにそれを並べ替え、あなたが望むものを返すでしょう。 –

1

実はこれは正しいです:たとえば、あなたは、2012年4月31日(無効な日付)で日付を作成した場合、PHPは、2012年5月1日(月の初日)を返します!エラーが発生種類、および警告を生成します種類:

これは事はおよそDateTime::createFromFormat予期しないことが認識入力の種類があるということですシーン

1

PHPは奇妙な獣です。 56/56/2012は、それが正しいようになるまで(神はこの背後にある論理のみを知っている)、日付に加えられるすべての追加の月と日をもたらします。

+1

私は疑う:チェックの –