[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]