Zend Framework [5] - Zend_DateとZend_Locale 入門

2007.11.26 Author: Jas

システムを構築するときには必ずといってよいほど使われるのが日付関連関数。
今回はZend Frameworkの日付関数について紹介します。

まずは、現在の日時を表示させてみましょう。

require_once 'Zend/Date.php';

// デフォルトタイムゾーン(サマータイムがある地域はそれも適応される)
date_default_timezone_set('Asia/Tokyo');

$date = new Zend_Date();
print $date;

これだけで「2007/11/26 18:04:47」のように、'Y/m/d H:i:s'の形式で現在の日時を表示することができます。フォーマットを指定しなくてもデフォルトで決まった形式で日付データが出力できるのが良いですね。

でも、Zend Frameworkの日付関数はこれだけではありません。
他にも便利な機能が用意されているので見てみましょう。

まずは、日付の加減算方法を紹介します。
日付の加算をするにはadd()、減算をするにはsub()を使用します。

これらの関数の便利なところは、計算を行いたい日数や時刻を明示的に表現できる点です。
例えば、「今から12時間後」は下記のようにすれば取得することができます。
'TIMES'を使用する場合は引数を'H:i:s'で指定し、'HOUR'を使用する場合は時間の部分だけ(この場合は12時間後なので、'12')を指定すればよいので、下記の例の$dateと$date2はどちらも同じ日時を返します。

$date->add('12:00:00', Zend_Date::TIMES);
print $date;

$date2->add(12, Zend_Date::HOUR);
print $date2;


次に、二つの日時の比較してみましょう。
compare()を使用すると、日付の分の部分だけなど、日付の一部だけを比較することも可能です。

下記の例では現在の時刻の分の部分が30分より前か後かを比較しています。
毎時、0分から29分までは「まだ30分になっていません」と表示され、31分から59分までは「30分を過ぎました」と表示されます。また、30分のときはcompare()は0を返すので「30分です」と表示されます。

if ($date->compare(30, Zend_Date::MINUTE) == -1) {
    print "まだ30分になっていません";
} elseif ($date->compare(30, Zend_Date::MINUTE) == 1) {
    print "30分を過ぎました";
} else {
    print "30分です。";
}

単に、2つの日時が同じかどうかを知りたいときには、equals()で調べることができます。
使い方はcompare()と同様で、結果はboolean 値として返ってきます。

if ($date->equals(10, Zend_Date::HOUR)) {
    print "10時です。仕事を始める時間です。";
} else {
    print "10時ではありません。";
}

また、かわった比較用関数も用意されているようです。
指定した日時が未来かどうか、過去かどうか、今日かどうかを判別してくれる関数は、場合によっては便利かもしれませんね。

// 引数(タイムスタンプ)より未来かどうかを判定
if ($date->isLater(new Zend_Date())) {
	echo $date, " は、未来の時間です";

// 引数(タイムスタンプ)より過去かどうかを判定
} elseif ($date->isEarlier(new Zend_Date())) {
echo $date, " は、過去の時間です";
}

// 今日かどうかを判定
if ($date->isToday(new Zend_Date())) {
echo $date, " は、今日です";
}

この他にも昨日、明日、閏年、有効な日付かどうかの判定もできますし、タイムゾーンに応じた日の出日の入り時刻の計算までしてくれ、簡単に出力することができます。

日付関連のスクリプトを書くときに便利なものがもう一つあります。
それは、Zend_Localeで取り出すことができるロケール関連の情報です。

これまで日本の書式で日付や曜日、時間などを表示したい場合には、英語の書式から変換してあげる必要がありました。しかし、Zend Frameworkには地域特化した情報があらかじめ登録されているので、これらを利用すると簡単に書式の変更が可能になります。


require_once 'Zend/Locale.php';

// ロケールを日本に設定
$locale = new Zend_Locale('ja_JA');

$month = $locale->getTranslationList('month');
echo $month[1];


例えば、上のように書くだけで、「1月」と表示することができます。
getTranslationList('month')で各月の名称を配列で取得することができます。
$monthの中はこのようになっています。

Array (
    [1] => 1 月
    [2] => 2 月
    [3] => 3 月
    [4] => 4 月
    [5] => 5 月
    [6] => 6 月
    [7] => 7 月
    [8] => 8 月
    [9] => 9 月
    [10] => 10 月
    [11] => 11 月
    [12] => 12 月
)

'month'の代わりに、引数を'day'にすれば曜日名が取得できますし、時間('timeformat')や日付('dateformat')のフォーマットの情報も取得することができます。

また、日付関連以外にも世界の言語や地域などの訳語情報も登録されていますし、日本語以外にもドイツ語やフランス語への変換も可能です。これらの情報をうまく使っていけば、書式の変更用にわざわざ関数を作成する手間も省けますし、タイムゾーン指定の日付データと合わせて使用すれば、多言語対応のサイト構築もより簡単になるのではないでしょうか。

ただし、Zend_Dateにはちょっとした問題点もあるので、次回はその問題点を紹介したいと思います。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ