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

    <title>日付の作成</title>

    <para>
        <classname>Zend_Date</classname> は、さまざまな方法で自分自身のインスタンスを作成できます。
        本章では、そのなかでもより便利な方法を紹介します。
    </para>

    <sect2 id="zend.date.creation.actual">

        <title>実際の日付の作成</title>

        <para>
            日付オブジェクトを作成する最も簡単な方法は、実際の日付を作成することです。
            <command>new Zend_Date()</command> か、あるいは便利な静的メソッド
            <methodname>Zend_Date::now()</methodname> を使用すれば、
            作成時の日付情報を持つ <classname>Zend_Date</classname> のインスタンスが作成されます。
            日付、時刻、タイムゾーンのすべてに値が設定されます。
        </para>

        <example id="zend.date.creation.actual.example-1">

            <title>インスタンスによる作成</title>

            <para>
                新しいインスタンスの作成によって日付を作成する場合は、パラメータは何もいりません。
                もちろん後で説明するようにいくつかのパラメータは存在しますが、
                通常は、何も指定せずに <classname>Zend_Date</classname>
                のインスタンスを作成すれば現在の日付情報が得られます。
            </para>

            <programlisting language="php"><![CDATA[
$date = new Zend_Date();
]]></programlisting>

        </example>

        <example id="zend.date.creation.actual.example-2">

            <title>静的メソッドによる作成</title>

            <para>
                静的メソッドを使用したほうが簡単に日付を作成できるという場合もあるでしょう。
                そんな場合は <emphasis><methodname>now()</methodname></emphasis>
                メソッドが使用できます。これは、<command>new Zend_Date()</command>
                とした時と同じ内容の <classname>Zend_Date</classname> オブジェクトを返します。
                しかし、これは常にその時の日付情報を持つオブジェクトとなり、
                オプションのパラメータで値を変更することはできません。
            </para>

            <programlisting language="php"><![CDATA[
$date = Zend_Date::now();
]]></programlisting>

        </example>

    </sect2>

    <sect2 id="zend.date.creation.database">

        <title>データベースからの日付の作成</title>

        <para>
            データベースに日付データが格納されることもよくあります。
            しかし、データベースの種類によって日付データの扱いかたが異なるので面倒です。
            <emphasis>MsSQL</emphasis> は、<emphasis>MySQL</emphasis> などとくらべて大きく異なる日付出力を行います。
            しかし、<classname>Zend_Date</classname>
            を使用すると、データベースの日付データからの日付の作成を非常にシンプルに行えます。
        </para>

        <para>
            もちろん、データベースのほうで日付データを変換することもできるでしょう。
            たとえば <emphasis>datetime</emphasis> 型の値から分の値だけを取得することもできます。
            しかし、この処理には時間がかかります。
            また、データベースのクエリを作成するときにはまた別の方法で日付データを扱う必要があります。
        </para>

        <para>
            そこで、データベースの値から簡単に日付を作成するための方法を用意しました。
        </para>

        <example id="zend.date.creation.database.example-1">

            <title>データベースの日付データからの簡単な日付の作成</title>

            <para>
                すべてのデータベースは、
                可能な限りクエリを高速に処理するように作られています。
                日付を扱うのに一番時間のかからない方法は、
                データベースから Unix タイムスタンプを取り出すことです。
                データベースの内部は、日付の値をタイムスタンプ
                (Unix タイムスタンプではありません) で管理しています。
                つまり、クエリからタイムスタンプを作成するのにかかる時間は
                それを特定の書式に変換するのにかかる時間よるはるかに短くなります。
            </para>

            <programlisting language="php"><![CDATA[
// SELECT UNIX_TIMESTAMP(my_datetime_column) FROM my_table
$date = new Zend_Date($unixtimestamp, Zend_Date::TIMESTAMP);
]]></programlisting>

        </example>

        <example id="zend.date.creation.database.example-2">

            <title>データベースの日付データからの便利な日付作成法</title>

            <para>
                データベースの日付出力は、
                一見同じように見えてもそれぞれ異なっています。
                しかし、どれも <acronym>ISO</acronym> 標準の一部です。
                つまり、日付を作成するための最も簡単な方法は
                <constant>Zend_Date::ISO_8601</constant> を使うということになります。
                <constant>Zend_Date::ISO_8601</constant> を使用できるデータベースには、
                たとえば <emphasis>MySQL</emphasis> や <emphasis>MsSQL</emphasis> があります。
                しかし、それ以外のデータベースでも日付カラムを
                <acronym>ISO-8601</acronym> 形式で返すことが可能です。
                <acronym>ISO-8601</acronym> の大きな利点は、人間が読める形式だということです。
                一方、<acronym>ISO-8601</acronym> の欠点は、
                単純な Unix タイムスタンプに比べて計算に時間がかかるということです。
                しかし、Unix タイムスタンプは 1970 年 1 月 1 日
                以降の日付しかサポートしていないという点を考慮する必要があります。
            </para>

            <programlisting language="php"><![CDATA[
// SELECT datecolumn FROM my_table
$date = new Zend_Date($datecolumn, Zend_Date::ISO_8601);
]]></programlisting>

        </example>

    </sect2>

    <sect2 id="zend.date.creation.array">

        <title>配列からの日付の作成</title>

        <para>
            配列から日付を作成することもできます。
            これはシンプルで簡単な方法となります。
            使用する配列のキーは次のようになります。
        </para>

        <itemizedlist mark='opencircle'>
            <listitem>
                <para>
                    <emphasis>day</emphasis>: 日
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>month</emphasis>: 月
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>year</emphasis>: 年
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>hour</emphasis>: 時
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>minute</emphasis>: 分
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>second</emphasis>: 秒
                </para>
            </listitem>
        </itemizedlist>

        <example id="zend.date.creation.array.example">

            <title>配列による日付の作成</title>

            <para>
                通常は、新しい日付インスタンスを作成する際には完全な形式の日付配列を渡します。
                しかし、指定されていない項目があった場合は、
                その項目の値はゼロとして処理されます。
                つまり、たとえば hour を指定しなかった場合は
                <emphasis>0</emphasis> 時として扱われるということです。
            </para>

            <programlisting language="php"><![CDATA[
$datearray = array('year' => 2006,
                   'month' => 4,
                   'day' => 18,
                   'hour' => 12,
                   'minute' => 3,
                   'second' => 10);
$date = new Zend_Date($datearray)
;]]></programlisting>

            <programlisting language="php"><![CDATA[
$datearray = array('year' => 2006, 'month' => 4, 'day' => 18);
$date = new Zend_Date($datearray);
]]></programlisting>
        </example>

    </sect2>

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