1

日付を「jnY G:i (26.6.2012 15:22)」として表示する日付検索フィルターを実行しています。ユーザーは、日付全体またはその一部のみを入力できます。「26.6」、「6.2012」、「6」、「15:22」はすべて有効な入力です。データベースでこの日付を確認する必要があるため、形式をデータベースの形式に変更する必要があります。そのために私は使用します:

$datum = '25.6.2012';
$date = DateTime::createFromFormat('j.n.Y',$datum);
echo $date->format('Y-m-d H:i');

$datum が jnY の形式でない場合にエラーが発生する場所 (jn または上記の文字列部分の 1 つだけを入力すると、エラーが発生します)。

問題は、入力された文字列 'jnY' について、日付の正しい出力を取得することです。これには、現在の時刻も日付文字列に追加されます (最初の日付文字列にはありませんでした)。例: 「22.6.2012」と入力すると、「2012-06-22 15:33」という出力が得られます。

これら 2 つの問題は、既存の php 関数で修正できますか、それとも自分で作成する必要がありますか?

助けていただければ幸いです。

4

2 に答える 2

1

許容可能なデータ形式を配列にリストし、ループしDateTime::createFromFormat()て入力のいずれかが許容可能な日付を生成するかどうかを確認できます。

$formats = array( 'j.n', 'j.n.Y');
$datum = '25.6.2012'; $date = false;

foreach( $formats as $format) {
    $date = DateTime::createFromFormat( $format, $datum);
    if( !($date === false)) break;
}

if( $date === false) {
    echo "Invalid date!\n";
}

最後に、新しく作成されたオブジェクトの現在の時刻を取り除き、時刻を に設定したい場合は、日付オブジェクトでメソッドを00:00:00使用するだけです:setTime()

// Sets the time to O hours, 0 minutes, 0 seconds
$date->setTime( 0, 0, 0);
于 2012-06-27T13:45:51.223 に答える
0

最初の問題については、受け入れ可能な入力の一部が認識されている入力形式に含まれていないため、独自のコードを記述する必要があります。入力値を正規化するには、それを完全に解析する必要があります (正規表現から始めるのが良い方法です)。その後、DateTime::createFromFormat問題なく呼び出すことができます。

!2 番目の問題については、フォーマット文字列の先頭に感嘆符を付けると、時間の問題が解決されます。ドキュメントから:

format に文字が含まれている場合!、生成された時刻の format で提供されていない部分と、! の左側の値は、Unix エポックの対応する値に設定されます。

Unix エポックは 1970-01-01 00:00:00 UTC です。

ただし、上記のように入力を完全に解析する必要があるため、問題はありません。また、感嘆符を使用すると、年、月、日の値が欠落し、おそらく望ましくないデフォルトが使用されることに注意してください。

于 2012-06-27T13:45:54.187 に答える