# 導入

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

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

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

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

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

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

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

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

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

## なぜ 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 によって両方ともサポートしています。 日付文字列が PHP の date() フォーマットトークンである "`Y/m/d`" や "`Y-m-d H:i:s`" といった形式になる場合は、 Zend_Date が持つ ISO-8601 日付書式の組み込みサポートを使用します。

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

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