PHP < 5.3.0 の DateTime::createFromFormat
-
22-09-2019 - |
質問
と同じ関数を探しています DateTime::createFromFormat ただし、v5.3 より古いバージョンの PHP を実行している環境で動作する必要があります。基本的には、で使用するような形式を提供する必要があります。 日付() 次に、その形式に対して文字列を解析/検証し、文字列が正しく形式設定されている場合はタイムスタンプと有効な日付を返す必要があります。
そのようなものをどこで見つけられるか知っている人はいますか、それとも自分で書かなければなりませんか?
繰り返しますが、これは引数として指定された特定の形式で機能する必要があります。形式は何でもよいので、そのまま使用できるという保証はありません strtotime().
解決
DateTime::createFromFormat
そして date_parse_from_format
この機能は、特に米国の日付/時刻形式を使用しないユーザー向けにコードを作成する開発者からの需要が高かったため、PHP 5.3 で追加されました。
これらが導入される前は、使用している形式を解析するための特定の関数を開発する必要がありました。PHP 5.3 未満の場合、一般的に行われることは次のとおりです。
- アプリケーションがどの形式を受け入れるかを決定する
- 次のようなメッセージを表示します 「入力は JJ/MM/AAAA である必要があります」 (フランス語で DD/MM/YYYY)
- その形式に関して入力がOKであることを確認してください
- そしてそれを解析して、PHP が理解できる日付/時刻に変換します。
つまり、各形式は 1 つの異なる追加の検証 + 解析機能を意味するため、アプリケーションと開発者は通常、それほど多くの形式を許可していませんでした。
あらゆる形式に対応できるそのような関数が本当に必要な場合は、残念ながら自分で記述する必要があると思います :-(
おそらくソースを見てみると、 date_parse_from_format
C コードを理解していれば役立つでしょうか?それは次のようなものである必要があります ext/date/php_date.c
-- しかし、それほど単純ではないようです:それはを呼んでいます timelib_parse_from_format
で定義されている関数 ext/data/lib/parse_date.c
, 、あまりフレンドリーには見えません^^
他のヒント
あなたは、Zend FrameworkのからZend_Dateのクラスを使用することができます。 zend.com/manual/en/zend.date.htmlする
$date = new Zend_Date($string, $format);
$timestamp = $date->get();
使用できます strptime()
- 使っています strftime()
フォーマット。と比べると少し違います date()
フォーマットしますが、ほぼ同じことを行います。
function createFromFormat($strptimeFormat, $date) {
$date = strptime($date, $strptimeFormat);
$date['tm_year'] += 1900;
$date['tm_mon']++;
$timestamp = mktime($date['tm_hour'], $date['tm_min'], $date['tm_sec'], $date['tm_mon'], $date['tm_mday'], $date['tm_year']);
return new DateTime('@'. $timestamp);
}
5.3 より前の PHP バージョンの場合は、以下のこの関数を使用して取得します 日付時刻 次のようにフォーマットされたオブジェクト形式の文字列 'DD.MM.YYYY'
.
function ParseForDateTimeValue ($strText)
{
if ($strText != "")
{
if (ereg("^([0-9]{1,2})[/\.]\s*([0-9]{1,2})[/\.]\s*([0-9]{2,4})$",$strText,$arr_parts)) {
$month = ltrim($arr_parts[2], '0');
$day = ltrim($arr_parts[1], '0');
$year = $arr_parts[3];
if (checkdate($month, $day, $year)) {
return new DateTime(date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
}
}
}
return NULL;
}
- まず入力が正しいかどうかを検証します。
- 次に、月、日、年を抽出します
- checkdate を使用して日付を検証します。
- それをタイムスタンプに変換し、DateTime のコンストラクターに渡して返します。
あなたは、あなたが取得する文字列の上にいくつかのtimestamp
を行うことができますtimestamp
を作成するには... explode
を作成し、日付を介して実行することができます..
$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);