第8章 Zend_Date

目次

8.1. 導入
8.1.1. デフォルトタイムゾーンの設定
8.1.2. なぜ Zend_Date なのか?
8.2. 動作原理
8.2.1. 内部構造
8.3. 基本メソッド
8.3.1. 現在の日付
8.3.2. Zend_Date の使用例
8.4. Zend_Date API の概要
8.4.1. Zend_Date のオプション
8.4.2. 日付の値の操作
8.4.3. 多くの日付要素で共通に使用できる、Zend_Date の基本操作
8.4.4. 日付の比較
8.4.5. 日付および日付要素の取得
8.4.6. 一秒未満の単位の扱い
8.4.7. 日の出 / 日の入り
8.5. 日付関数全般用の定数
8.5.1. 定数の使用
8.5.2. 全定数の一覧
8.5.3. ISO 書式指定子を使用して自分で定義する出力フォーマット
8.5.4. PHP の date() 関数の書式指定子を使用して自分で定義する出力フォーマット
8.6. 動作例
8.6.1. 日付の確認
8.6.2. 日の出と日没
8.6.3. タイムゾーン

8.1. 導入

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

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

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

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

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

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

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

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

8.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 型で対応できる範囲のみとなります。 "float の大きさはプラットフォーム依存です。ただし、通常はおよそ 10 進数で 14 桁の精度があり、最大値は ~1.8e308 (これは 64ビット IEEE フォーマットです) となります。" [ http://www.php.net/float ] さらに、float 型そのものの特性により、計算結果に丸め誤差が生じる問題があります。 これを避けるため、ZF の i18n コンポーネントでは もし BCMath 拡張モジュールが使用可能ならそれを使用するようにしています。

  • ISO_8601 日付仕様のサポート

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

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

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