次の形式の日付文字列がありますd/m/y
。22/02/13
この文字列をエコーしたいのですY-m-d
が、次のコードを使用すると、機能しません。
$d = '22/02/13';
echo date('Y-m-d', strtotime($d));
出力:1970-01-01
私は何が間違っているのですか?これを/
区切り文字として展開して手動で実行する必要がありますか、それともよりシンプルでエレガントなソリューションがありますか?
マニュアルから:
ノート:
m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間のセパレーターを調べることで明確になります。セパレーターがスラッシュ(/)の場合、アメリカのm / d/yが想定されます。一方、区切り文字がダッシュ(-)またはドット(。)の場合、ヨーロッパのdmy形式が想定されます。
あいまいさの可能性を回避するために、可能な場合はISO 8601(YYYY-MM-DD)の日付またはDateTime :: createFromFormat()を使用することをお勧めします。
tl; dr:スラッシュを使用すると、am / d/yのクレイジーなアメリカンスタイルの日付になります。
最も簡単な回避策は、DateTimeクラスを使用して独自の形式を作成することです。
$date= DateTime::createFromFormat('d/m/y', '21/11/13');
echo $date->format('Y-m-d');
を使用/
すると、PHPは日付(mm/dd/yy
)のアメリカンスタイルのフォーマットを使用していると見なすため、必要な出力をダッシュに置き換えます。
$d = str_replace('/', '-', '22/02/13');
echo date('Y-m-d', strtotime($d));
見る
DateTime::createFromFormat(...)
これにより、正しいDateTime値が作成されます。
より簡単な方法:
$d = '22.02.13';
echo date('Y-m-d', strtotime($d));
サルドス ;)
このため
「注: m/d/y または dmy 形式の日付は、さまざまな構成要素間の区切り記号を調べることで明確になります。区切り記号がスラッシュ (/) の場合、アメリカの m/d/y が想定されます。一方、区切り文字がダッシュ (-) またはドット (.) の場合、ヨーロッパの dmy 形式が想定されます。潜在的なあいまいさを避けるために、可能であれば ISO 8601 (YYYY-MM-DD) 日付または DateTime::createFromFormat() を使用することをお勧めします."