12

多くの人が PHP の日付/時刻の問題に苦労しているようで、必然的に受け入れられる答えの多くは「このように使用するstrtotime」である傾向があります。

これは、日付の問題を扱っている人々を導く最良の方法ですか? 私はstrtotime、重要な日付/時刻の計算に必ずしも依存すべきではない気の利いたトリックのようなものだと感じ始めています.・行動を予測する。MM/DD/YYYY と DD/MM/YYYY を区別できないことは、大したことではありません。

通常、StackOverflow は優れたプラクティスを促進するのに非常に優れています ( mysql_real_escape_string「代わりに PDO を使用してください」と言う人がいない会話はめったに見ません)。

しかし、PHP の日付に関する問題については、受け入れられた基準がないように思われますstrtotime

では、私たちはこれについて何をすべきでしょうか? 「X に 1 週​​間を足すにはどうすればよいですか」、「この日付形式をこの別の日付形式に変換するにはどうすればよいですか」などの質問をする人に対して、強制すべきより良い基準はありますか?

strtotimeしようとしても失敗することが多い日付/時刻の問題に対処するための最良の、最も信頼できる方法は何ですか?

4

7 に答える 7

22

まず、関数を使用できるようにする DateTime オブジェクトを使用することを強く支持しDateTime::createFromFormat()ます。DateTime オブジェクトを使用すると、コードがはるかに読みやすくなり、60 * 60 * 24 を使用して Unix タイムスタンプ全体を変更して日付を進める必要がなくなります。

そうは言っても、 strtotime() が取る任意の文字列を予測するのはそれほど難しくありません。サポートされている日付と時刻の形式に、サポートされている形式を示します。

MM/DD/YYYY と DD/MM/YYYY を区別できない例のように、Date Formatsに基づいて区別します。スラッシュを使用する日付は、常にアメリカ形式として読み取られます。したがって、00/00/0000 の形式の日付は常に MM/DD/YYYY として読み取られます。または、ダッシュまたはピリオドを使用すると DMY になります。たとえば、00-00-0000 は常に DD-MM-YYYY として読み取られます。

ここではいくつかの例を示します。

<?php
$dates = array(
    // MM DD YYYY
    '11/12/2013' => strtotime('2013-11-12'),
    // Using 0 goes to the previous month
    '0/12/2013' => strtotime('2012-12-12'), 
    // 31st of November (30 days) goes to 1st December
    '11/31/2013' => strtotime('2013-12-01'), 
    // There isn't a 25th month... expect false
    '25/12/2013' => false,

    // DD MM YYYY
    '11-12-2013' => strtotime('2013-12-11'),
    '11.12.2013' => strtotime('2013-12-11'),
    '31.12.2013' => strtotime('2013-12-31'),
    // There isn't a 25th month expect false
    '12.25.2013' => false,
);

foreach($dates as $date => $expected) {
    assert(strtotime($date) == $expected);
}

ご覧のとおり、いくつかの重要な例が25/12/2013あり、12.25.2013どちらも反対の形式で読み取った場合に有効ですがfalse、サポートされている日付と時刻の形式に従って無効であるため、返されます...

ご覧のとおり、動作は非常に予測可能です。いつものように、使用入力から日付を受け取る場合は、最初にその入力を検証する必要があります。最初に入力を検証しないと、どの方法も機能しません。

読み取られる日付について非常に具体的にしたい場合、または指定された形式がサポートされていない形式である場合は、を使用することをお勧めしDateTime::createFromFormat()ます。

于 2011-03-18T10:07:36.957 に答える
8

strtotime()v4.xの時代からPHPで使用されているため、基本的に利用可能であることが保証されているため、が推奨されます。可用性は、それが向きを変えて、誤って解析された日付であなたを尻に噛むという奇妙な時間(しゃれは意図されていません)よりも優先されます。

日付計算を行う現在の「適切な」方法は、DateTime / DateIntervalオブジェクトを使用することですが、これらはPHP(5.2 / 5.3、私は思う)に最近追加されたものであるため、常に利用できるとは限りません。 。バツ。

于 2011-03-13T03:40:45.970 に答える
2

よく使いますstrtotime()。つまり、松葉杖として使用するべきではありませんが、その制限に注意する必要があります。

標準を適用したい場合は、cベースを使用する必要があると思いますmktime()。たとえば、1週間後に取得するには:

date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') + 7);
于 2011-03-13T03:40:22.087 に答える
0

問題は、アプリケーションのすべてのレイヤーで日付/時間/ゾーンの値 (ISO8601:2004) に厳密なデータ形式を選択し、この形式を最適に処理する PHP 関数を見つけなければならないことです。DateTime::createFromFormat().

異なる日付/時間/ゾーン形式を持つ私見は、ユーザー インターフェイス (GUI レイヤー) 用です。PHP 関数内で日付入力を推測しようとすると、クライアント側からデータのサニタイズを実行していないことを意味します (おそらく Javascript を使用しますか?) Web フォーミュラーから未知の形式でデータを転送しています。

日付/時間/ゾーンの形式がサーバー側の ISO8601 と一致しない場合は、単純に拒否します。

お役に立てれば!

于 2011-03-19T17:29:58.803 に答える
0

Derek Rethans は、Froscon 2010 で「PHP における高度な日付と時刻の処理」に関する講演を行いました。

http://derickrethans.nl/talks/time-froscon10.pdfで PDF 形式のスライドを見つけてください。これらは最新の PHP (5.2 以降) に依存しており、これを使用することもベスト プラクティスである必要があります。

于 2011-03-18T10:52:47.367 に答える
0

更新: PHP >= 5.3の場合、代わりにdate_parse_from_format()を使用する必要があります。Noteは、システムの C ライブラリによって公開されてstrptime()いる に依存しているため、異なるオペレーティング システムでは異なる動作をする可能性があります。strptime()

PHP で日付を計算する最も信頼できる方法は、タイムスタンプを使用することです。

32 ビット整数によって制限されることは事実ですが、たとえば PHP 4 などの奇妙な環境で入力する場合、Date オブジェクトを使用することはできません。

最も正しい動作を確実に得るために、 を使用しstrptime()て人間が読める日付からタイムスタンプを取得することをお勧めします。これは、日付の形式を推測しようとせず、指定した日付形式を使用するため、 strtotime()andよりも優れています。strftime()

正しいタイムスタンプを取得したら、PHP で複数のメソッドを使用して作業を完了できます。

于 2011-03-18T12:37:57.017 に答える
0

PHP では確かに可能です: strtotime マニュアル、特にこのコメントを確認してください。

MySQL 接続が利用可能な場合、SELECT DATE_ADD( '2011-05-31', INTERVAL 1 MONTH ) は、(正しい) 機能が既に実装されているため、自分で実装する必要はありません。

于 2013-04-19T07:10:14.560 に答える