第14章 Zend_Date

目次

14.1. 導入
14.1.1. デフォルトタイムゾーンの設定
14.1.2. なぜ Zend_Date なのか?
14.2. 動作原理
14.2.1. 内部構造
14.3. 基本メソッド
14.3.1. 現在の日付
14.3.2. Zend_Date の使用例
14.3.2.1. 日付の出力
14.3.2.2. 日付の設定
14.3.2.3. 日付の加減算
14.3.2.4. 日付の比較
14.4. Zend_Date API の概要
14.4.1. Zend_Date のオプション
14.4.1.1. 日付の書式の型の選択
14.4.1.2. 夏時間と月
14.4.1.3. 月の計算
14.4.1.4. 日付の地域化や正規化の、Zend_Cache による高速化
14.4.1.5. Zend_TimeSync による同期したタイムスタンプの取得
14.4.2. 日付の値の操作
14.4.3. 多くの日付要素で共通に使用できる、Zend_Date の基本操作
14.4.3.1. 日付要素の一覧
14.4.3.2. 日付操作の一覧
14.4.4. 日付の比較
14.4.5. 日付および日付要素の取得
14.4.6. 一秒未満の単位の扱い
14.4.7. 日の出 / 日の入り
14.5. 日付の作成
14.5.1. 実際の日付の作成
14.5.2. データベースからの日付の作成
14.5.3. 配列からの日付の作成
14.6. 日付関数全般用の定数
14.6.1. 定数の使用
14.6.2. 全定数の一覧
14.6.3. ISO 書式指定子を使用して自分で定義する出力フォーマット
14.6.4. PHP の date() 関数の書式指定子を使用して自分で定義する出力フォーマット
14.7. 動作例
14.7.1. 日付の確認
14.7.2. 日の出と日没
14.7.3. タイムゾーン

14.1. 導入

Zend_Date コンポーネントは、 日付や時刻を操作するための、きめ細かくシンプルな API を提供します。 このメソッドを使用すると、日付の各部分を含めた広範囲の情報を扱えます。 さまざまな機能がもたらす可能性は、PHP の既存の日付関連の関数をはるかに上回っています。 最新のマニュアルは、 オンライン版 (Subversion の更新と同期しています) を参照ください。

シンプルに扱えることを目標とはしていますが、 各地域の日付や時刻を操作 (変更や合成、比較など) する際にはある程度複雑になってしまうことは避けられません。 日付や時刻は、地域によって表記方法が異なることがよくあります。 たとえば、カレンダーの日付を表す際にまず月が最初にくるところもあれば、 年が最初にくるところもあります。 地域の処理および正規化についての詳細は、 Zend_Locale を参照ください。

Zend_Date は、多くの言語における月名の短縮表記に対応しています。 Zend_Locale は、タイムスタンプにおける各地域の月名や曜日名に対応しており、 それを他の地域での表記に変換することもできます。

14.1.1. デフォルトタイムゾーンの設定

日付関連の関数を PHP や Zend Framework で使う前には、 まずアプリケーションにデフォルトタイムゾーンが設定されているかどうかを確認しましょう。 これは、環境変数 TZ で指定するか、あるいは php.ini の設定 date.timezonedate_default_timezone_set() を使用して行います。 PHP では、日付や時刻関連の関数が特定のユーザに対して動作するようにするには デフォルトのタイムゾーンを設定します。 タイムゾーン設定の完全な一覧は、 CLDR Timezone Identifier List を参照ください。

例 14.1. デフォルトタイムゾーンの設定

// カリフォルニアのアメリカ人用のタイムゾーン
date_default_timezone_set('America/Los_Angeles');
// ドイツのドイツ人用のタイムゾーン
date_default_timezone_set('Europe/Berlin');

Zend_Date のインスタンスを作成すると、 そのタイムゾーンは自動的に現在のデフォルトタイムゾーンになります! したがって、そのタイムゾーン設定は夏時間 (DST) も事実上考慮したものになるでしょう。 明示的に夏時間 (DST) を指定する必要はありません。

タイムゾーン UTC および GMT には夏時間が存在しないことに注意しましょう。 つまり、たとえ手動で夏時間を使うよう設定したとしても、 UTCGMT に設定された Zend_Date のインスタンスはその影響を受けないということです。

14.1.2. なぜ Zend_Date なのか?

Zend_Date が提供する機能は次のとおりで、これは PHP の日付関数群を拡張したものです。

  • シンプルな API

    Zend_Date の提供する API は非常にシンプルです。 これは、四つのプログラミング言語の日付および時刻に関連する機能から、 いいところを抜き出してまとめたものです。 たとえば、二つの時刻を加算したり比較したりすることは一行でできてしまいます。

  • 完全な国際化

    月名や曜日名とその短縮形について、130 以上の言語をサポートしています。 メソッドの入力や出力で、これらの各地域の月名、曜日名を使用することができます。

  • 制約のないタイムスタンプ

    PHP 5.2 のドキュメントでは "タイムスタンプの有効範囲は、通常は Fri, 13 Dec 1901 20:45:54 GMT から Tue, 19 Jan 2038 03:14:07 GMT までです" と書かれていますが、Zend_Date は ほぼ無制限に近い範囲をサポートしています。これは、BCMath 拡張モジュールのおかげです。 BCMath が使用できない場合は、Zend_Date がサポートするタイムスタンプの範囲が制限され、 使用しているサーバのフロート型で対応できる範囲のみとなります。 "float の大きさはプラットフォーム依存です。ただし、通常はおよそ 10 進数で 14 桁の精度があり、最大値は ~1.8e308 (これは 64ビット IEEE フォーマットです) となります。" [ http://www.php.net/float ] さらに、float 型そのものの特性により、計算結果に丸め誤差が生じる問題があります。 これを避けるため、Zend Framework の I18n コンポーネントでは もし BCMath 拡張モジュールが使用可能ならそれを使用するようにしています。

  • ISO-8601 日付仕様のサポート

    ISO-8601 の日付仕様をサポートしています。 ISO-8601 の日付仕様の一部にのみ準拠しているものについても識別できます。 これらの日付書式は、データベースを使用する際に特に有用です。 たとえば、MsSQL と MySQL の日付書式は微妙に異なりますが、 Zend_Date は、書式指定定数 Zend_Date::ISO_8601 によって両方ともサポートしています。 日付文字列が PHPdate() フォーマットトークンである "Y/m/d" や "Y-m-d H:i:s" といった形式になる場合は、 Zend_Date が持つ ISO-8601 日付書式の組み込みサポートを使用します。

  • 日の出、日の入り時刻の計算

    任意の場所と日付に対する日の出、日の入り時刻を表示できます。 これにより、一秒たりとも無駄にすることなく お好みの PHP プロジェクトで作業できることでしょう (^o^)