[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 を使った方が良さそうですね。