[Zend Framework] Zend_Date: 日付の計算をする

日付の計算方法を調べ、あわせていろいろ試しました。
Zend Framework Version: 1.12.3

Contents

Zend_Date

$date = new Zend_Date();
$date
    ->set(日時)
    ->add(7, Zend_Date::DAY);
$date->get('yyyy-MM-dd');

set で日時を渡すと、get で欲しい書式で日付を返してくれます。
わかりやすい。

月初・月末問題

「『今日が31日で、先月が31日未満』の場合等に期待した結果が得られない」とのこと。
PHPの挙動を理解できていませんが、Zend_Date をつかえば分かりやすくかけました。

// 日付の作成
$now = strtotime("2013-07-31 10:00");
// date()で求める場合
$beginningOfMonth
    = date("Y-m-01", $now);
$endOfMonth
    = date("Y-m-t", $now);
$beginningOfLastMonth
    = date("Y-m-01", strtotime("-1 month", $now));
    // date("Y-m-d", strtotime("first day of - 1 month",$now));
$endOfLastMonth
    = date("Y-m-t", strtotime("-1 month", $now));
    // date("Y-m-d", strtotime("last day of - 1 month", $now));
// Zend_Date()で求める場合
$date = new Zend_Date($now);
$ZendBeginningOfMonth
    = $date->set($now)->get('yyyy-MM-01');
$ZendEndOfMonth
    = $date->set($now)->get('yyyy-MM-ddd');
$ZendBeginningOfLastMonth
    = $date->set($now)->sub(1, Zend_Date::MONTH)->get('yyyy-MM-01');
$ZendEndOfLastMonth
    = $date->set($now)->sub(1, Zend_Date::MONTH)->get('yyyy-MM-ddd');
// 表示
echo "<h3>月初・月末問題</h3>";
echo "<b>今月の月初</b><br />";
echo "date      : " . $beginningOfMonth . "<br />";
echo "Zend_Date : " . $ZendBeginningOfMonth . "<br />";
echo "<b>今月の月末</b><br />";
echo "date      : " . $endOfMonth . "<br />";
echo "Zend_Date : " . $ZendEndOfMonth . "<br />";
echo "<b>前月の月初</b><br />";
echo "date      : " . $beginningOfLastMonth . "<br />";
echo "Zend_Date : " . $ZendBeginningOfLastMonth . "<br />";
echo "<b>前月の月末</b><br />";
echo "date      : " . $endOfLastMonth . "<br />";
echo "Zend_Date : " . $ZendEndOfLastMonth . "<br />";
結果
月初・月末問題
今月の月初
date : 2013-07-01
Zend_Date : 2013-07-01
今月の月末
date : 2013-07-31
Zend_Date : 2013-07-31
前月の月初
date : 2013-07-01
Zend_Date : 2013-06-01
前月の月末
date : 2013-07-31
Zend_Date : 2013-06-30

西向くサムライ問題

echo "<h3>西向くサムライ問題</h3>";
// 日付の作成
$now = strtotime("2013-12-31 10:00");
// date()で求める場合
$lastMonth = date('Y-m-d', strtotime('2012-12-31 -1 month'));
echo "date      : " . $lastMonth . "<br />";
// Zend_Date()で求める場合
$date = new Zend_Date($now);
$ZendLastMonth
    = $date->set($now)->sub(1, Zend_Date::MONTH)->get('yyyy-MM-dd');
echo "Zend_Date : " . $ZendLastMonth . "<br />";

たしかに。

結果
西向くサムライ問題
date : 2012-12-01
Zend_Date : 2013-11-30

年指定子Y問題

echo "<h3>年指定子Y問題</h3>";
// 日付の作成
$now = strtotime("2013-01-31 10:00");
// Zend_Date()で求める場合
$date = new Zend_Date($now);
$date->set($now)->sub(1, Zend_Date::MONTH);
echo "yyyy-MM-dd: " . $date->get('yyyy-MM-dd') . "<br />";
echo "YYYY-MM-dd: " . $date->get('YYYY-MM-dd') . "<br />";

これだけ確認できませんでした。

結果
年指定子Y問題
yyyy-MM-dd: 2012-12-31
YYYY-MM-dd: 2012-12-31

日付の処理ははまりポイントのようです。
Zend_Date を使った方が良さそうですね。