<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.date.introduction">

    <title>導入</title>

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

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

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

    <sect2 id="zend.date.setdefaulttimezone">

        <title>デフォルトタイムゾーンの設定</title>

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

        <example id="zend.date.setdefaulttimezone.example-1">
            <title>デフォルトタイムゾーンの設定</title>
            <programlisting language="php"><![CDATA[
// カリフォルニアのアメリカ人用のタイムゾーン
date_default_timezone_set('America/Los_Angeles');
// ドイツのドイツ人用のタイムゾーン
date_default_timezone_set('Europe/Berlin');
]]></programlisting>
        </example>

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

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

    <sect2 id="zend.date.why">

        <title>なぜ Zend_Date なのか?</title>

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

        <itemizedlist mark='opencircle'>
            <listitem>
                <para>
                    シンプルな <acronym>API</acronym>
                </para>
                <para>
                    <classname>Zend_Date</classname> の提供する <acronym>API</acronym> は非常にシンプルです。
                    これは、四つのプログラミング言語の日付および時刻に関連する機能から、
                    いいところを抜き出してまとめたものです。
                    たとえば、二つの時刻を加算したり比較したりすることは一行でできてしまいます。
                </para>
            </listitem>
            <listitem>
                <para>
                    完全な国際化
                </para>
                <para>
                    月名や曜日名とその短縮形について、130 以上の言語をサポートしています。
                    メソッドの入力や出力で、これらの各地域の月名、曜日名を使用することができます。
                </para>
            </listitem>
            <listitem>
                <para>
                    制約のないタイムスタンプ
                </para>
                <para>
                    <acronym>PHP</acronym> 5.2 のドキュメントでは "タイムスタンプの有効範囲は、通常は
                    Fri, 13 Dec 1901 20:45:54 <acronym>GMT</acronym> から Tue, 19 Jan 2038 03:14:07 <acronym>GMT</acronym> までです"
                    と書かれていますが、<classname>Zend_Date</classname> は
                    ほぼ無制限に近い範囲をサポートしています。これは、BCMath
                    拡張モジュールのおかげです。
                    BCMath が使用できない場合は、<classname>Zend_Date</classname> がサポートするタイムスタンプの範囲が制限され、
                    使用しているサーバのフロート型で対応できる範囲のみとなります。
                    "float の大きさはプラットフォーム依存です。ただし、通常はおよそ 10
                    進数で 14 桁の精度があり、最大値は <command>~1.8e308</command> (これは 64ビット <acronym>IEEE</acronym>
                    フォーマットです) となります。" [
                    <ulink url="http://www.php.net/float">http://www.php.net/float</ulink>
                    ]
                    さらに、float 型そのものの特性により、計算結果に丸め誤差が生じる問題があります。
                    これを避けるため、Zend Framework の I18n コンポーネントでは
                    もし BCMath 拡張モジュールが使用可能ならそれを使用するようにしています。
                </para>
            </listitem>
            <listitem>
                <para>
                    <acronym>ISO-8601</acronym> 日付仕様のサポート
                </para>
                <para>
                    <acronym>ISO-8601</acronym> の日付仕様をサポートしています。
                    <acronym>ISO-8601</acronym> の日付仕様の一部にのみ準拠しているものについても識別できます。
                    これらの日付書式は、データベースを使用する際に特に有用です。
                    たとえば、MsSQL と
                    <ulink url="http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html">MySQL</ulink>
                    の日付書式は微妙に異なりますが、
                    <classname>Zend_Date</classname> は、書式指定定数
                    <link linkend="zend.date.constants.list">Zend_Date::ISO_8601</link>
                    によって両方ともサポートしています。
                    日付文字列が <acronym>PHP</acronym> の <methodname>date()</methodname> フォーマットトークンである
                    "<command>Y/m/d</command>" や "<command>Y-m-d H:i:s</command>" といった形式になる場合は、
                    <classname>Zend_Date</classname> が持つ <acronym>ISO-8601</acronym> 日付書式の組み込みサポートを使用します。
                </para>
            </listitem>
            <listitem>
                <para>
                    日の出、日の入り時刻の計算
                </para>
                <para>
                    任意の場所と日付に対する日の出、日の入り時刻を表示できます。
                    これにより、一秒たりとも無駄にすることなく
                    お好みの <acronym>PHP</acronym> プロジェクトで作業できることでしょう (^o^)
                </para>
            </listitem>
        </itemizedlist>

    </sect2>

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
