kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

PHPの日付判定について考える(4)

PHPでの時間処理でのはまりどころ??

date('Y-m-d H:i:s', strtotime('2014-05-31 +1 month'));

 

表示結果:2014-07-01 00:00:00

 

5月から1ヶ月を追加した日付だから6月がでてほしいような・・・

 

この結果自体はバグでないです。

 

6月31日??を求めようとしてると。。。

6月31日はない。

 

だから7月1日が出力される。

 

この1ヶ月追加の考え方にはいくつかあると思ってます。

・30日追加

・月の日数を追加

・暦の1ヶ月

 

暦の1ヶ月は

[postgresで算出] 

select (timestamp '2014-05-31' + interval '1 month') as date;
        date
---------------------
2014-06-30 00:00:00

 

 しっかりと6月30日になったりします。

 

PHPでは月の日数を追加。かな。

 

date('Y-m-d H:i:s', strtotime('2014-05-01 +1month'))
date('Y-m-d H:i:s', strtotime('2014-06-01 +1month'))
date('Y-m-d H:i:s', strtotime('2014-05-31 +1month'))
date('Y-m-d H:i:s', strtotime('2014-06-30 +1month'))

 

出力結果

2014-06-01 00:00:00(31日追加)
2014-07-01 00:00:00(30日追加)
2014-07-01 00:00:00(31日追加)
2014-07-30 00:00:00(30日追加)

 

postgresでのinterval(こっちは暦かな)

select (timestamp '2014-05-01' + interval '1 month') as date

select (timestamp '2014-06-01' + interval '1 month') as date

select (timestamp '2014-05-31' + interval '1 month') as date

select (timestamp '2014-06-30' + interval '1 month') as date

出力結果

2014-06-01 00:00:00(31日追加)

2014-07-01 00:00:00(30日追加)

2014-06-30 00:00:00(30日追加)

2014-07-30 00:00:00(30日追加)

 

プログラムを組む上で意外に考えておかないと落とし穴になることもあるので注意です。

 

実はこれは実生活にも少し影響があって、

契約期間とか、定期券とか。。

 

定期券は暦。

少しの日数だけど実は少なくなる場合があったりすると思ってる。。。

 

まぁ、影響があるのは、月末ぐらいかな。