[Zend Framework] Zend_Date: 日付の計算をする
日付の計算方法を調べ、あわせていろいろ試しました。
Zend Framework Version: 1.12.3
[markdown]
## Zend_Date
> * [日付関数全般用の定数 – Zend_Date – Zend Framework](http://framework.zend.com/manual/1.12/ja/zend.date.constants.html)
“`php
$date = new Zend_Date();
$date
->set(日時)
->add(7, Zend_Date::DAY);
$date->get(‘yyyy-MM-dd’);
“`
set で日時を渡すと、get で欲しい書式で日付を返してくれます。
わかりやすい。
## 月初・月末問題
> * [【PHP】月末・月初の出力方法 – Qiita [キータ]](http://qiita.com/shori0917/items/0a2f4a64e55d84919a1c)
「『今日が31日で、先月が31日未満』の場合等に期待した結果が得られない」とのこと。
PHPの挙動を理解できていませんが、Zend_Date をつかえば分かりやすくかけました。
“`php
// 日付の作成
$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 “
月初・月末問題
“;
echo “今月の月初
“;
echo “date : ” . $beginningOfMonth . “
“;
echo “Zend_Date : ” . $ZendBeginningOfMonth . “
“;
echo “今月の月末
“;
echo “date : ” . $endOfMonth . “
“;
echo “Zend_Date : ” . $ZendEndOfMonth . “
“;
echo “前月の月初
“;
echo “date : ” . $beginningOfLastMonth . “
“;
echo “Zend_Date : ” . $ZendBeginningOfLastMonth . “
“;
echo “前月の月末
“;
echo “date : ” . $endOfLastMonth . “
“;
echo “Zend_Date : ” . $ZendEndOfLastMonth . “
“;
“`
“`:結果
月初・月末問題
今月の月初
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
“`
## 西向くサムライ問題
> * [[PHP]日付計算の時、strtotimeの挙動に気をつけて! | ikemonn's blog](http://www3441ui.sakura.ne.jp/wordpress/?p=177)
“`php
echo “
西向くサムライ問題
“;
// 日付の作成
$now = strtotime(“2013-12-31 10:00”);
// date()で求める場合
$lastMonth = date(‘Y-m-d’, strtotime(‘2012-12-31 -1 month’));
echo “date : ” . $lastMonth . “
“;
// Zend_Date()で求める場合
$date = new Zend_Date($now);
$ZendLastMonth
= $date->set($now)->sub(1, Zend_Date::MONTH)->get(‘yyyy-MM-dd’);
echo “Zend_Date : ” . $ZendLastMonth . “
“;
“`
たしかに。
“`:結果
西向くサムライ問題
date : 2012-12-01
Zend_Date : 2013-11-30
“`
## 年指定子Y問題
> * [Zend_Date の年指定子には’y'を使おう | 開発メモるアル](http://shusatoo.net/programming/php/zend-framework/zend_date-year-specifier-yyyy-useful/)
“`php
echo “
年指定子Y問題
“;
// 日付の作成
$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’) . “
“;
echo “YYYY-MM-dd: ” . $date->get(‘YYYY-MM-dd’) . “
“;
“`
これだけ確認できませんでした。
“`:結果
年指定子Y問題
yyyy-MM-dd: 2012-12-31
YYYY-MM-dd: 2012-12-31
“`
日付の処理ははまりポイントのようです。
Zend_Date を使った方が良さそうですね。
[/markdown]