[PHP-users 31357] strtotime()関数での日付加算

Arikata Koichi arikatakou @ silicon-breath.jp
2007年 2月 1日 (木) 22:13:36 JST


Hamuuと申します。

現在時刻を元に、「2ヶ月後の末日」を算出したいと思っています。
たとえば、現在時刻が「2007年1月15日 15:00:00」だった場合、
「2007年3月31日」を算出したいわけです。
以下のように、ある時刻のタイムスタンプを元にstrtotime()関数で
3ヶ月後の年、月を計算し、mktime()関数で"日"の引数として0を
与えて再度タイムスタンプに戻しました。
------------------------------------------------------------
$base_timestamp = '元になるタイムスタンプ';
$request_timestamp
= mktime( 0,0,0
//時分秒
	, (integer)date("m",strtotime("+3 month",$base_timestamp))	//月
	,
0									//日
	, (integer)date("Y",strtotime("+3 month",$base_timestamp)) )	//年
  );
------------------------------------------------------------
これまで特に問題なく動作していたのですが、上記の$base_timestampに
「2007-01-31 15:00:00」を与えた場合、期待しない値になってしまいました。
ちなみに期待値は「2007-03-31」です。

------------------------------------------------------------
$base_timestamp = strtotime('2007-01-31 15:00:00'); $request_timestamp
= mktime( 0,0,0
//時分秒
	, (integer)date("m",strtotime("+3 month",$base_timestamp))	//月
	,
0									//日
	, (integer)date("Y",strtotime("+3 month",$base_timestamp)) )	//年
  );
date("Y-m-d",$request_timestamp)の値:「2007-04-30」
------------------------------------------------------------

$base_timestampをいろいろ変えて試してみました。
------------------------------------------------------------
$base_timestamp = strtotime('2007-01-30 15:00:00');
date("Y-m-d",$request_timestamp)の値:「2007-03-31」
これは、OK(期待通り)です。

$base_timestamp = strtotime('2008-01-31 15:00:00');
date("Y-m-d",$request_timestamp)の値:「2008-04-30」
1年後の同じ日付もダメです。

$base_timestamp = strtotime('2006-12-31 15:00:00');
date("Y-m-d",$request_timestamp)の値:「2007-02-28」

$base_timestamp = strtotime('2007-12-31 15:00:00');
date("Y-m-d",$request_timestamp)の値:「2007-02-29」
上記2つを見ると、閏年は考慮されているように見えます。

$base_timestamp = strtotime('2007-07-30 15:00:00');
date("Y-m-d",$request_timestamp)の値:「2007-09-30」
30日の月の場合もOKです。

$base_timestamp = strtotime('2007-06-30 15:00:00');
date("Y-m-d",$request_timestamp)の値:「2007-08-31」
30日の月から31日の月もOKです。
------------------------------------------------------------

mktime()関すに渡す引数をひとつずつみると、
$base_timestampを"2007-01-31"のタイムスタンプのとき、
date("m",strtotime("+3 month",$base_timestamp) の値が「5」に
なってしまっています。(期待値は「4」)
mktime()での末日の求め方は、PHPのマニュアルを参考にしました。
これは1/31に限っておこるものなのか、算出方法に問題があるのか、
よくわかりません。
同じような現象に会われた方はいらっしゃいませんでしょうか?
また、関数の使用方法等、問題がある場合はご指摘いただけません
でしょうか?

よろしくお願い致します。






PHP-users メーリングリストの案内