Strtotime()はdd / mm / YYYY形式では機能しません


167

私はstrtotime()関数が本当に好きですが、ユーザーマニュアルにはサポートされている日付形式の完全な説明はありません。strtotime('dd/mm/YYYY')機能しませんmm/dd/YYYY。フォーマットでのみ機能します。

日付dd/mm/YYYY形式の場合、どのように変換できYYYY-mm-ddますか?explode()関数を使用してそれを行うことができますが、もっと良い解決策があると思います。


7
実際に解析するために「YYYY-mm-dd」形式に変換する必要はありません。「dd-mm-YYYY」に変更する必要があります。これは次の方法で実行できますstr_replace('/', '-', $date);
Gavin Coates

回答:


399

簡略化したソリューションは次のとおりです。

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

結果:

2010-05-25

strtotimeドキュメントは読み取ります。

m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間のセパレーターを確認することで明確になります。セパレーターがスラッシュ(/)の場合は、アメリカのm / d / yが想定されます。一方、区切り文字がダッシュ(-)またはドット()の場合、ヨーロッパのdmy形式が想定されます。


2
@Web Logic strtotime()関数のデフォルト形式を理解できません。strtotimr('01 -01-2010 ')と書いても、dd-mm-YYYYまたはmm-dd-YYYY形式として理解できますか?
Simon

3
あなたがそれをテストした場合:echo date('Y-m-l', strtotime('01-01-2010'));結果は2010-01-Fridayです。したがって、最後に来る日は、date関数に日付形式を指定する方法によって異なります。

1
ここに投稿した内容は正しく、ユーザーの質問に答えますが、これは実際の問題を解決するための迂回的な方法です。strtotime()が「dd / mm / yy」の形式で日付を正しく解析できるようにするには、「/」を「-」に置き換える必要があります。したがって、実際に必要なのは最初の2行だけ$date = '25/05/2010'; $date = str_replace('/', '-', $date); です。問題を解決するために追加の行は必要ありません。
Gavin Coates 14

これが正しいのは、日が12より大きい場合のみです。$ date = '1/2/34'; // 2034年2月1日echo date( 'd M Y'、strtotime($ date)); // 02 2034
1

どうも。本当に私の一日を作りました。
BEingprabhU 2018

64

DateTime :: createFromFormatを使用して、カスタム形式(PHP 5.3以降)から日付を解析できます

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(余談:!は、指定されていない値をUnixタイムスタンプにリセットするために使用されます。つまり、時刻は午前0時になります。)


PHP 5.3を使用したくない(または使用できない)場合、strtotimeが受け入れる使用可能な日付/時刻形式の完全なリストは、日付形式のマニュアルページにリストされています。そのページでm/d/Yは、推測された事実についてより詳しく説明してd/m/Yいます(ただし、ここでの回答で述べたようにd-m-Yd.m.Yまたはを使用できますd\tm\tY)。


過去にはstr_replace、別の答えで言及されている簡単な方法、および日付文字列を次のような別の形式に自己解析する手段も使用しました

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

17

これは多くの問題に対する良い解決策です:

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}

16

STRTOTIMEの記述から注:

m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間の区切り文字を調べることで明確になります。区切り文字がスラッシュ(/)の場合は、アメリカのm / d / yであると見なされます。一方、区切り文字がダッシュ(-)またはドット(。)の場合は、ヨーロッパのdmy形式が想定されます。

それはそれと同じくらい簡単です。


エラーは発生しませんが、チェック$t$t1て別の結果を表示しているときに実装できます。このようにチェックしました。 $t=strtotime(date('d-m-Y'));および $t1=strtotime(date('m/d/Y'));
vusan 2012年

3

おそらく最速は

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

形式が適切な形式になっていない場合はfalseが返されますが、日付が有効かどうかはチェックされません


2

より良い解決策が見つかりません。あなたは使用することができexplode()preg_match_all()など

私はこのような静的ヘルパー関数を持っています

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

おそらくもっと良い名前がありますがausStrToTime()、オーストラリアの日付(私がよく扱うオーストラリア人)で機能するので使用します。より良い名前はおそらく標準化された名前でしょうが、それが何であるかはわかりません。


2

ddmmyy形式をdate("Y-m-d"形式に変換しようとしましたが、直接渡すと機能しませんでしたddmmyy =date('dmy')

次に、それがyyyy-mm-dd形式でなければならないことに気付きました。部分文字列を使用して整理

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

次に渡された date("Y-m-d",strtotime($strParam));

出来た!


2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

これはあなたのために働くでしょう。文字列をカスタム日付形式に変換します。ここで、文字列の元の形式が与えられていたものをPHPに指定できます。これで日付形式になりましたので、PHPのデフォルトの日付形式に変換できます。これは、MySQLで使用されているものと同じです。


最もクリーンで最高のソリューション
マルコマルサラ

1

この値をデータベースから取得していますか?その場合は、データベースでフォーマットすることを検討してください(date_formatたとえば、mysqlで使用)。そうでない場合は、strtotimeがdd / mm / yyyyの値を正しく認識していないように見えるため、値を分解するのが最善の策である可能性があります。


1

dd / mm / YYYYであることがわかっている場合は、次のようにできます。

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

d / m / YYまたはdd / mm / YYYY(または2つの任意の組み合わせ)の形式の日付に一致します...

/以外の区切り文字もサポートしたい場合は、正規表現を次のように変更できます。

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

次に、[/-]ビットに必要な文字を追加します(注-文字は最後にする必要があります)


きっとあなたの正規表現を使用する必要があり\d小数点以下の桁数のためではなく、[/d]ために、スラッシュまたはd文字
10

1

この回避策は、explodeよりシンプルでエレガントです。

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

日付を取得する形式を知っている必要はありませんが、スラッシュが付いている場合、それらは完全なストップに置き換えられ、strtotimeによってヨーロッパ言語として扱われます。


0

最も簡単な解決策はこれです:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));

3
これは間違っています。質問は、dd / mm / yyyy入力に明示的に関連しています。
Matt Fletcher

0

これは、先行ゼロがあったとしても、私が使用しているソリューションです。

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>

0

$ date_info = '2019年2月20日'; echo date( 'Ym-d'、strtotime(str_replace( '/'、 '-'、$ date_info)));


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.