PHPで月の最終日を求める
アクセス解析の検索キーワードで、タイトルのようなことを検索していてここに行き着いた方がいらしたようなので。
たぶん検索に引っかかったのは、月の最終日を求める関数のエントリなんではないかと。
上記の方がまた来るとは限らないけど、せっかくなので。
まぁ PHP でプログラミングしてるときに、自分も月の最終日を求めたかったことがある。
今では、関数化して My ライブラリのような感じでまとめてあるものの中に入っている。
ということで、たいしたものでもないけど、せっかくの縁ということで公開してみようとおもう。
(もっといい方法があるとか、標準関数とかに実はあるとかご存じの方がいらしたら、コメントででも教えてくれるとうれしいです)
たぶん検索に引っかかったのは、月の最終日を求める関数のエントリなんではないかと。
上記の方がまた来るとは限らないけど、せっかくなので。
まぁ PHP でプログラミングしてるときに、自分も月の最終日を求めたかったことがある。
今では、関数化して My ライブラリのような感じでまとめてあるものの中に入っている。
ということで、たいしたものでもないけど、せっかくの縁ということで公開してみようとおもう。
(もっといい方法があるとか、標準関数とかに実はあるとかご存じの方がいらしたら、コメントででも教えてくれるとうれしいです)
さて、まずは準備として、年月に月を加算する関数を定義します。
(まぁしなくても同等のことをすればいいんだけどね)
引数は、指定の年と月、後何ヶ月加算するか。
まぁやってることは単純で、基準の月に加算する月を足して、12以下になるまで12ずつ減算。
減算する度に年をインクリメント。
んで、年と月の入った配列を返している。
今見てみると、while の中の if はいらねんじゃね?とも思うが、
かなり昔に作ったものなのでここは記念にそのまま掲載しておこう。
で、次が問題の月の最終日を求める関数になる。
やってることはPostgreSQLのときと同じなんですけどね。
引数は、求めたい年と月。
まず1行目で翌月を求めます。
ここで先ほど定義した月を加算する関数を利用しています。
次の行はちょっと複雑(ホントかよ)
そして求めたエポックタイムから 60*60*24 秒(=24時間)減算します。
これにより求まったエポックタイムは、指定の月の最終日の12:00:00になります。
12:00:00にしていることに特に意味はありませんが、00:00:00だと何かの関係で誤差がでたらいやだなというおまじないみたいなものに過ぎません(苦笑
で、求めたエポックタイムを localtime 関数に渡してあげて、返ってきた配列のうちの日付部分を返すだけです。
こんなことしなくても、閏年用とそうでない年用の月の日数の配列を用意しておいて、
求めたい年と月を渡して、渡された年が閏年かどうか判定して、それぞれの配列にセットされている日数を返すという関数を用意してあげるという方法もありますけどね。
単に計算でやるほうが何となく好きなだけだったので、今回のような方法をとってみただけなんですけど。
まぁ配列用意してやるほうが、ステップ数が減ってごくわずかとはいえ処理は軽くなる気もしますが・・・。
(まぁしなくても同等のことをすればいいんだけどね)
function add_month($year,$month,$add){
$month += $add;
while( $month > 12 ){
if( $month > 12 ){
$year ++;
$month -= 12;
}
}
$temp['year'] = $year;
$temp['month'] = $month;
return $temp;
}引数は、指定の年と月、後何ヶ月加算するか。
まぁやってることは単純で、基準の月に加算する月を足して、12以下になるまで12ずつ減算。
減算する度に年をインクリメント。
んで、年と月の入った配列を返している。
今見てみると、while の中の if はいらねんじゃね?とも思うが、
かなり昔に作ったものなのでここは記念にそのまま掲載しておこう。
で、次が問題の月の最終日を求める関数になる。
function last_day($year,$month){
$temp = add_month($year,$month,1);
$temp_time = localtime(mktime(12,0,0,$temp['month'],1,$temp['year'],0)-60*60*24);
return $temp_time[3];
}やってることはPostgreSQLのときと同じなんですけどね。
引数は、求めたい年と月。
まず1行目で翌月を求めます。
ここで先ほど定義した月を加算する関数を利用しています。
次の行はちょっと複雑(ホントかよ)
mktime(12,0,0,$temp['month'],1,$temp['year'],0)まずこの部分で、翌月の1日の12:00:00のエポックタイムを求めます。
そして求めたエポックタイムから 60*60*24 秒(=24時間)減算します。
これにより求まったエポックタイムは、指定の月の最終日の12:00:00になります。
12:00:00にしていることに特に意味はありませんが、00:00:00だと何かの関係で誤差がでたらいやだなというおまじないみたいなものに過ぎません(苦笑
で、求めたエポックタイムを localtime 関数に渡してあげて、返ってきた配列のうちの日付部分を返すだけです。
こんなことしなくても、閏年用とそうでない年用の月の日数の配列を用意しておいて、
求めたい年と月を渡して、渡された年が閏年かどうか判定して、それぞれの配列にセットされている日数を返すという関数を用意してあげるという方法もありますけどね。
単に計算でやるほうが何となく好きなだけだったので、今回のような方法をとってみただけなんですけど。
まぁ配列用意してやるほうが、ステップ数が減ってごくわずかとはいえ処理は軽くなる気もしますが・・・。
カテゴリ:
PHP
トラックバック
このブログ記事に対するトラックバックURL
http://fakelife.info/mt/system/mt-tb.cgi/17
» [PHP] PHPで月の最終日を求める(技術メモ)~のトラックバック
月の最終日は、翌月の1日の前日です。 よって、たとえば2007年9月の最終日は、date(”d”, strtotime(”2007-10-01 -1 d... 続きを読む
コメントする