9

こんにちは私はdatetimeメソッドを期待どおりに機能させるのに問題があるようですか?私は何か間違ったことをしているのでしょうか?

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

ここに画像の説明を入力してください

4

3 に答える 3

52

認識される予期しない入力には、エラーを生成する種類と警告を生成する種類の2DateTime::createFromFormat種類があります。

のような入力'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";
}

実際の動作をご覧ください

于 2012-04-12T09:17:14.863 に答える
2

PHPは(控えめに言っても)奇妙な獣です。56/56/2012その結果、日付が正しくなるまで、追加の月と日がすべて追加されます(神はこの背後にあるロジックのみを知っています)。

于 2012-04-12T09:19:50.460 に答える
0

実際、これは正しいです。たとえば、2012/04/31(無効な日付)で日付を作成した場合、PHPは2012/05/01(5月の初日)を返します。

これは舞台裏で行われます

于 2012-04-12T09:16:23.770 に答える