web-dev-qa-db-ja.com

DateTimeクラスとネイティブPHP date-functions

DateTimeクラスには確かにいくつかの便利なメソッドがあり、ネイティブPHP strtotimemktimestrftimeなどの日付関数よりも全体的に優れているようです(およびmore)しかし、私がそれを使用すべきではないという欠点や理由はありますか?

私が考えることができる唯一の理由は、関数を使用するよりも、クラスのインスタンス全体を作成する方がコストがかかる可能性があるということです。

  • 同意しますか?
  • 単純なものにDateTimeオブジェクトを使用することはまったく意味がありますか?
  • 他に欠点はありますか?

これらの2つのオプションを常に切り替えるのは少し混乱しているように思われるので、私がやりたいことを明確にしたいと思います。

私の決定の2つの例は次のとおりです。

  • 日付をローカライズされた値に変換する
  • 2つの日付の間の時間を計算する
23
Anonymous

クラスインスタンスの作成に費用がかかり、パフォーマンスが低下することが心配な場合は、間違ったツリーに吠えているのではないかと思います。実証済みのOOアプローチを使用するのが理にかなっているのかどうかを考えるべきではありません。特定の日付計算を実行するためにDateTimeクラスを使用するのが理にかなっている場合は、それを使用してください。それほど費用はかかりません。 100万個のDateTimeオブジェクトを作成するなどのクレイジーなことをしない限り、アプリがそれを感じる場所。

DateTimeが優れている理由は、オブジェクトの作成時にタイムゾーンを指定することで、夏時間の心配を軽減するためです。また、日付の違いを取得したり、異なるオブジェクト間の間隔を取得したりするのも簡単です。それは基本的に必要な心配とコーディングの量を減らします(しかし私はそれが時々間違っていることを認めます、うまくいけばそれはPHPの5.4リリースで対処されるでしょう)。

結論-私はいつもそれを使います。

44
N.B.

記録のために、私はクラスDateTimeを使用するのを間違えました。それは大きな間違いでした。それはいくつかの素晴らしい機能を持っていますが、努力する価値はありません。私は説明する:

フォーム(日付ピッカー付き)があり、データベースに保存しているとすると、日付を表す3つの形式があります。

  1. 内部的には、変数のタイプはDateTime()です。
  2. 視覚的には、ユーザーに表示される変数は、dd-mm-yyyyまたはmm-dd-yyyyの形式の文字列です(地域の設定によって異なります)。
  3. データベースに格納されている変数も、yyyy-mm-dd(ANSI)形式の文字列です。

だから、私は同じタイプのデータに対して3つの異なる種類の表現を扱っています

また、シリアル化する場合(json、xmlなど)、それはシリアル化です。

object(stdClass)#1 (1) {
  ["field1"]=>
  object(DateTime)#2 (3) {
    ["date"]=>
    string(26) "2018-12-02 09:14:09.216273"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(30) "America/Argentina/Buenos_Aires"
  }
}

シリアル化しようとするのは本当に苦痛です。私の代替手段は単純で、任意の一時的な日付を文字列として保存し、必要な場合にのみDateTimeに変換します。

object(stdClass)#3 (1) {
  ["field1"]=>
  string(19) "2018-12-02 09:14:09"
}
0
magallanes

DateTime()を使用すると、strtotime()などの関数の手続き型アプローチと比較してコードが読みやすくなります。

if( strtotime( date( 'm/d/Y', strtotime( $strStartDate ) ) ) > strtotime( date( 'm/d/Y', strtotime( '+6 month', strtotime( $strEndDate ) ) ) ) ) {

vs

if( new DateTime( $strStartDate ) > ( new DateTime( $strEndDate ) )->modify( '+6 month' ) ) {

Windows 64ビット開発マシンでは、PHPはまだ32ビットです。1901年12月13日金曜日20:45:54UTCから2038年1月19日火曜日03:14までの日付で奇妙な結果が得られます。 :07 UTC

echo ( new DateTime( '20 Jan 2038' ) )->format( 'm/d/Y' ) . PHP_EOL; // gives 01/20/2038
echo strtotime( '20 Jan 2038' ); // returns false

https://www.php.net/manual/en/function.strtotime.php#refsect1-function.strtotime-notes

注:タイムスタンプの有効な範囲は、通常、1901年12月13日金曜日20:45:54 UTCから2038年1月19日火曜日03:14:07UTCまでです。 (これらは、32ビット符号付き整数の最小値と最大値に対応する日付です。)PHP 5.1.0より前では、すべてのプラットフォームが負のタイムスタンプをサポートしているわけではないため、日付範囲はこれは、たとえば1970年1月1日より前の日付は、Windows、一部のLinuxディストリビューション、およびその他のいくつかのオペレーティングシステムでは機能しないことを意味します。64ビットバージョンのPHPの場合、有効な範囲は次のとおりです。 64ビットはどちらの方向でも約2930億年を表すことができるため、タイムスタンプは事実上無限です。


夏時間がネイティブの日時関数で適切に処理されているかどうかはわかりません。


ネイティブの日時関数よりもDateTime()関数を使用することをお勧めします。

0