0

私は会社のコードベースでこれに遭遇しました、そして私はそれを単なる関数のためにmysqlに接続しないものに変更したいと思います:

$sql = "select date_format(str_to_date('$date','$format'),'%Y-%m-%d') startDate ";
$result = mysql_query($sql);
...

私たちの本番環境は、私の開発環境と同様にUNIXの種類ですが、Windows環境でコードを作成する人もいるためstrptime()、オプションではありません。

SOの周りに同様の質問が浮かんでいるのを見たことがありますが、私のニーズに合った答えはありません。変数形式を使用して文字列から日付を抽出する簡単な、または一般的な方法はありますか?

日付形式が大きく異なる可能性がある理由は、ベンダーからのファイル名を解析しているためです。そのため、yyyymmdd、mmddyyyy、ddmmyyyy、ddmonyyyyなどを処理できる必要があります。

4

2 に答える 2

1

時間であるほとんどの文字列(「来週の木曜日」などを含む)をタイムスタンプに変換するPHP関数strtotime() PHP Refがありますが、ヨーロッパとアメリカの日付構造( "dd / mm / yyyy")を処理する場合でも多少混乱する可能性があります。対"mm/ dd / yyyy")。

http://www.functions-online.com/strtotime.htmlで(テストスクリプトを記述せずに)テストできます。

于 2011-03-23T14:59:10.020 に答える
1

簡単に言うと、すべての形式を正しく解析する任意の日付形式を自動的に解析する方法はありません。独自のサンプル形式では、どの数値がどの日付の増分であるかを知る方法はありません。

strtotime()の受け入れられている形式を確認できます。すべてのベンダーがそれによって認識されている形式を使用している場合は、幸運です。しかし、そうでない場合、実際にできる最善の方法は、のルックアップテーブルを作成してから、date_parse_from_format()"vendor" => "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基本的に、フォーマットが日付文字列の各文字が表すもののマスクであるルックアップテーブルを用意する必要があります。

注:各日付/時刻の増分に使用されるマスクは、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
)
于 2011-03-23T15:01:59.373 に答える