昨年末に「2013年に読まれた記事トップ10」を書く際にサイト統計を見たのですが、圏外すぐに「第何何曜日」がありました。古い記事ですが、それなりによく読まれています。
ところでいま調べなおしてみたら、PHP の strtotime()
には便利な機能があるではありませんか。前の記事を書くときには見落としていたのか……。前の記事の脚注を見ると PHP 4 と書いているから、まだ使えなかったのかな。
というわけで、いま風に書き直してみます。
Y 年 m 月の第 i の w 曜日は、その月の d 日か
PHP ならこれはもう簡単で、そのまま書くだけです。
Y, m, i, w
という記号では書きにくいので、具体的に「2013年12月の第3木曜日」を例にすると、
$d = date("d", strtotime("third Thursday of Dec 2013"));
です。「今月の第3木曜日」なら “third Thursday of this month” ですし、「次の第3木曜日」なら “third Thursday” だけです[1]。なんて簡単なんだ。
ここに日本語が使えると便利なのですが、さすがにそこまではできないようです。というのは、「おととい」を指定するのが、英語だと “day before yesterday” で、まどろっこしいからです。日本語だと今日の前後2日までは短い言葉があるのに[2]、英語だと前後1日までで、その先は持って回ったような言い方になってしまいます。話はやや違いますが、PostgreSQL の SQL でも “today”, “yesterday”, “tomorrow” のキーワードは使えるのですが(ほかの DB はどうなんでしょう?)、「おととい」をしょっちゅう入力したい私はしかたなく日付を使っていて、どうにかしたいなあと思っているのでした。
さて、前の記事の際の動機はゴミの収集日でした。「第 2, 4 月曜日」だとすると、次のゴミの日は
$gomi = date("Y-m-d", min( strtotime("second Monday"), strtotime("fourth Monday") ) );
で済みます。
ちょうど当該日にこれを実行すると、その日になります。しかしゴミの収集時刻 14:00 を過ぎていたら次の収集日を出力してほしいですね。
$base = ( date("G") <= 14 ) ? strtotime("today") : strtotime("tomorrow"); $gomi = date("Y-m-d", min( strtotime( "second Monday", $base ), strtotime( "fourth Monday", $base ) ) ); }
ちょっときれいじゃない気がするけど、こんなのでいいのかなあ。