紹介しているコードではうまく動作しない場合があることが判明しました。
現在調査・修正中ですが、現在の私のPHPの知識だと解明しきれない可能性もあります。
PHPでカレンダーとか作ってる時、今週って今月の何週目だっけ?みたいなのが必要になることがあります。
date関数には1月1日からの週番号を求める関数はありますが、月内での週番号を求める関数はありません。(見落としているだけかもしれませんが…)
どうしたもんかなと思ったのですが、結構簡単に計算できたのでメモしておきます。
求め方を考える
date関数には先程も書いたように、1月1日からの週番号を求めるための関数はあります。
そこで、今日が第何週なのかと、今月1日が第何週なのかを調べて、その差に1を足せば、今週が今月の第何週なのかがわかりますね。
例えば、今日(2013/08/28)は第35週ですが、今月1日は、第31週です。
35-31は4、そこに1を足すと今週は8月の第5週目だということがわかります。
なんで1を足すのかというと、1月で考えると分かりやすいですが、
求めたい日は1月1日で第1週目。その月の1日も当然第1週目。ところが、1−1は0になってしまいます。
同様に、1月10日は第2週目。その月の1日はやっぱり1週目。すると2-1は1ですね。
つまり、うまく説明しにくいのですが、純粋に第何週目なのか同士を引いただけだとその差は0からスタートになり、1週分ずれてしまいます。
だから、1からスタートになるように最後に1を足しているのです。
書いてみる
これらをまとめて、PHPで書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $currentYear = date('Y'); $currentMonth = date('m'); $currentDay = date('d'); $p1 = mktime(0,0,0,$currentMonth,$currentDay,$currentYear); $p2 = mktime(0,0,0,$currentMonth,1,$currentYear); $p3 = mktime(0,0,0,$currentMonth,date('t',$currentMonth),$currentYear); $p4 = date('W',$p1); $p5 = date('W',$p2); $p6 = date('W',$p3); $p7 = $p4 - $p5 +1; $p8 = $p6 - $p5 + 1; echo '今週は'.$p4.'週目<br>'; echo '今月1日は'.$p5.'週目<br>'; echo '今月最終日は'.$p6.'週目<br>'; echo 'よって今週は今月の第'.$p7.'週目<br>'; echo 'そして今月は全部で'.$p8.'週あります。'; |
関数説明
使う関数は2個だけです。
date() |
これはお馴染みですよね。日付の文字列を求めるものです。 Yなら年、mは月、dは日付、そしてWはその年の第何週なのかを求めるものです。 |
mktime() |
日付からタイムスタンプを求めます。 |
6行目で今日の日付のタイムスタンプを求めてますが、これ自体はtime()関数でも同じ事ができます。
ただ、任意の日付を指定してその日がその月の第何週目かを求めたい場合は、こうしておいた方がいいですね。
あとは、先に説明したとおり、今週が第何週なのかと今月1日が第何週なのかを求め、その差に1を足せば出来上がりです。
実行させると、
今週は35週目
今月1日は31週目
今月最終日は35週目
よって今週は今月の第5週目
そして今月は全部で5週あります。
となるはずです。
あとは、適当に関数かなんかにしておけば良いんじゃないんでしょかね?
それでは。
年末の最終週の値が1となるのでそのままではバグりますよ。
ゆにっこさん
コメントありがとうございます。確かにおかしなことになりますね…。
少し見なおしてみようと思います