MySQL STR_TO_DATE()のPHPバージョン
-
29-10-2019 - |
質問
会社のコードベースでこれに遭遇しました。これを、関数だけでmysqlに接続しないものに変更したいと思います。 ジェネラコディセタグプレ
私たちの本番環境は、私の開発環境と同様にUNIXの種類ですが、Windows環境でコードを作成する人もいるため、strptime()
はオプションではありません。
同様の質問がSOの周りに浮かんでいるのを見たことがありますが、私のニーズに合った答えはありません。可変形式を使用して文字列から日付を抽出する簡単な、または一般的な方法はありますか?
日付形式が大きく異なる可能性がある理由は、ベンダーからのファイル名を解析しているためです。そのため、yyyymmdd、mmddyyyy、ddmmyyyy、ddmonyyyyなどを処理できる必要があります。
解決
短い回答は、 all フォーマットを正しく解析する任意の日付フォーマットを自動的に解析する方法がないということです。独自のフォーマットでは、どの日付が増加するかを知る方法はありません。
strtotime()を見ることができます。すべてのベンダーがそれによって認識されたフォーマットを使用する場合は、あなたは運を受けています。しかし、そうでない場合は、本当に"vendor" => "format"
のルックアップテーブルを作成してから、 date_parse_from_format()
編集: *下記のコメントに基づいて、これはあなたのニーズに合うDATE_PARSE_FROM_FORMAT()の近似値のPHP4バージョン* です。
.
function date_parse_from_format($format, $date) {
$dMask = array('H'=>'hour','i'=>'minute','s'=>'second','y'=>'year','m'=>'month','d'=>'day');
$format = preg_split('//', $format, -1, PREG_SPLIT_NO_EMPTY);
$date = preg_split('//', $date, -1, PREG_SPLIT_NO_EMPTY);
foreach ($date as $k => $v) {
if ($dMask[$format[$k]]) $dt[$dMask[$format[$k]]] .= $v;
}
return $dt;
}
基本的には、vendor => format
のルックアップテーブルを持つ必要があります。ここで、Formatは日付文字列内の各文字が表すもののマスクです。
注:各日付/時刻単位に使用されているマスクは、PHPの通常の date()文字列形式。簡素化され、カスタム文字列の個々の文字をマスクすることを意味します。
例:
.
/*
lookup table for vendors
for EVERY character you want to count as a date/time
increment you must use the following masks:
hour : H
minute : i
second : s
year : y
month : m
day : d
*/
$vendorDateFormats = array(
'vendor1' => 'yyyymmdd',
'vendor2' => 'mmddyyyy',
'vendor3' => 'ddmmyyyy',
'vendor4' => 'yyyy.mm.dd HH:ii:ss'
);
// example 1:
echo "<pre>";
print_r(date_parse_from_format($vendorDateFormats['vendor2'],'03232011'));
// example 2:
echo "<pre>";
print_r(date_parse_from_format($vendorDateFormats['vendor4'],'2011.03.23 12:03:00'));
出力:
.Array
(
[month] => 03
[day] => 23
[year] => 2011
)
Array
(
[year] => 2011
[month] => 03
[day] => 23
[hour] => 12
[minute] => 03
[second] => 00
)
他のヒント
ほとんどの文字列を変換するPHP関数strtotime()
PHP Ref がありますこれはタイムスタンプの時間(「来週の木曜日」などを含む)ですが、ヨーロッパとアメリカの日付構造(「dd / mm / yyyy」と「mm / dd / yyyy」)を扱う場合は多少混乱する可能性があります。
http://www.functionsで(テストスクリプトを記述せずに)テストできます。-online.com/strtotime.html