# 生成日期

因为需求的不同，`Zend_Date` 提供了若干不同的办法来创建自己的实例，本章将介绍最方便的办法。

## 生成当前日期

最简单的创建日期对象是生成当前的日期，通过创建new Zend_Date()的实例 或使用静态方法 Zend_Date::now() 都可以，它们都返回当前日期的 `Zend_Date` 实例。 当前的日期总是包括当前的日期和时间以及当前的时区。

### 通过实例生成日期

通过创建一个新的实例来生成日期意味着你不需要给出参数。当然有若干个参数我们将以后来描述，但一般 来说这是最简单和最常用的方法来获得当期日期为 `Zend_Date` 的实例。

    $date = new Zend_Date();

### 静态日期生成

有时候用静态方法生成日期更容易。因此，你可以使用 `now()` 方法， 它返回 `Zend_Date` 的一个新实例，就象你用 `new Zend_Date()` 一样。 但它将总返回当前日期并且不能用可选的参数修改。

    $date = Zend_Date::now();

## 从数据库生成日期

数据库常用来存储数据。问题是，每个数据库用不同的方式输出数据。`MsSQL` 数据库和 `MySQL` 数据库的日期标准就不一样。为简化起见，`Zend_Date` 可以很容易从数据库数据生成日期。

当然每个数据库都可以说把输出转换成定义好的特殊值。例如，你可以把 `datetime` 转换成输出分钟值。 但这很耗时并且当查询数据库时你确实需要用其它方法来处理日期。

所以我们有一个快速并方便的方法从数据库值生成日期。

### 快速从数据库生成日期

众所周知，所有的数据库都想尽可能快地查询数据，它们与生俱来就要快速响应。从数据库取得日期的最快 方法是使用unix时间戳。所有数据库在内部把日期值都存成时间戳（不是unix时间戳）。这意味着通过查询生 成时间戳要比转换成其它格式快。

    // SELECT UNIX_TIMESTAMP(my_datetime_column) FROM my_table
    $date = new Zend_Date($unixtimestamp, Zend_Date::TIMESTAMP);

### 从数据库方便地生成日期

即使是你乍一看它们都相同，但是所有数据库的标准输出还是不一样的。但它们都是 `ISO` 标准的一部分 并解释它，所以最容易的生成日期的方法是使用 `Zend_Date::ISO_8601`。 例如数据库里众所周知的 `MySQL` 和 `MsSQL` 被 `Zend_Date::ISO_8601` 认可。 但所有数据库也都可以返回一个 `ISO 8601` 表示的日期列。 `ISO 8601` 一个巨大的有点是人类可读。缺点是 `ISO 8601` 比 unix 时间戳需要更多 的时间来处理，但也应该知道 unix 时间戳只支持 1970年1月1日以后的日期。

    // SELECT datecolumn FROM my_table
    $date = new Zend_Date($datecolumn, Zend_Date::ISO_8601);

## 从数组生成日期

日期也可以从数组生成，这是个简单并容易的方法，使用的数组键是：

- 日: 日期的天数

- 月: 日期的月数

- 年: full year of the date

- 小时: 小时数

- 分钟: 分钟数

- 秒: 秒数

### 通过数组生成日期

一般地你需要给出一个完整的日期数组用于新的日期实例的生成，但当你没有给出所有值，未给出的值就是零。 这意味着如果没有给出小时值，那么就用 0 小时。

    $datearray = array('year' => 2006,
                       'month' => 4,
                       'day' => 18,
                       'hour' => 12,
                       'minute' => 3,
                       'second' => 10);
    $date = new Zend_Date($datearray);

    $datearray = array('year' => 2006, 'month' => 4, 'day' => 18);
    $date = new Zend_Date($datearray);