# 動作原理

なぜ Zend Framework で日付や時刻を処理するクラスが `Zend_Date` 以外に存在しないのでしょうか?

多くの言語では、日付を処理するクラスと時刻を処理するクラスを別にしています。 しかし、Zend Framework はシンプルであることを目指しています。 二つの異なるクラスの異なるメソッドを使用して日付と時刻をまとめるなどといったことは、 開発者にとっては面倒なことでしょう。 `Zend_Date` のメソッドは、すべての要素 (era, year, month, day, hour, minute, second, timezone) を含んでいるわけではないあいまいな日付でも動作するので、 開発者は柔軟かつ簡単に同じクラスの同じメソッドで同じ操作 (加算、減算、比較、合成など) をすることができます これら日付の構成要素を別々のクラスに分割すると、 それらを組み合わせる方法を覚えるのが大変になります。 クラスをひとつにしておくと、同じようなことをする際のコードの重複が抑えられます。 また、複雑な継承階層を考える必要もなくなります。

## 内部構造

- UNIX タイムスタンプ

  すべての日付や時刻は、たとえそれがあいまいな値 (年がないなど) であっても内部的には特定の時刻で表されます。 内部での形式は UNIX タイムスタンプとなります。これは、指定した時刻と January 1st, 1970 00:00:00 GMT の差です。 これが可能なのは、`Zend_Date` が UNIX タイムスタンプや整数値の制限を受けないからです。 BCMath 拡張モジュールにより、 Fri, 13 Dec 1901 20:45:54 GMT から Tue, 19 Jan 2038 03:14:07 GMT の範囲を超えた非常に大きな日付をサポートすることができます。 また、もし BCMath 拡張モジュールを使用しなければ、 float 型そのものの制限や丸め誤差によって計算結果がおかしくなる可能性があります。

- 日付の一部はタイムスタンプのオフセットで表す

  したがって、"三時間" を表すインスタンスの内部表現は、 January 1st, 1970 00:00:00 GMT から三時間後のタイムスタンプ、 つまり 0 + 3 * 60 * 60 = 10800 となります。

- PHP 関数

  使用できるところでは、`Zend_Date` はできるだけ PHP の関数を使用してパフォーマンスを向上させます。