補遺: いいように日付を解釈してくれるもの

最初に申し上げると、id:hnw大先生の記事を読んでないことがバレバレで大変恥ずかしい思いでおります。そうしている間にid:hnw大先生にコメントつけられちゃってid:hnw大先生に会わせる顔がないです…。ううう。

『今月の月末って何日?』問題の解

date 関数で t というフォーマット文字を使うと、今月の月末がとれますよー。

http://d.hatena.ne.jp/ichii386/20090121/1232494796#c

いやー、これはすばらしい。というかエレガントですね。id:p4life大先生ありがとうございます。もやし食べて精進します!!

date('t') の中身としては、php4/5ともに日数のテーブルからlookupしてるだけのようでした。個人的に至る所に散らばってるので、ちまちま書き直していこうっと。

  • php4: ext/standard/datetime.c
 62 static int phpday_tab[2][12] = {
 63     {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
 64     {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
 65 };
  • php5: ext/date/lib/dow.c
 66                                 /*     jan  feb  mar  apr  may  jun  jul  aug  sep  oct  nov  dec */
 67 static int d_table_common[13]  = {  0,   0,  31,  59,  90, 120, 151, 181, 212, 243, 273, 304, 334 };
 68 static int d_table_leap[13]    = {  0,   0,  31,  60,  91, 121, 152, 182, 213, 244, 274, 305, 335 };
 69 static int ml_table_common[13] = {  0,  31,  28,  31,  30,  31,  30,  31,  31,  30,  31,  30,  31 };
 70 static int ml_table_leap[13]   = {  0,  31,  29,  31,  30,  31,  30,  31,  31,  30,  31,  30,  31 };

『strtotime関数との付き合い方』という意味で

基本的にid:hnw大先生のおっしゃる通りなんですが、GNUに明確なドキュメントを求めても、これといったものが見つからないんですよね。

GNUのリリースポリシーはよくわからないけれど、getdate.yはいろんなものに同梱されていて、バージョンらしきものもないようです。なので、GNU dateでこの記法が通ったからと言ってほかでも通るとも限らないのかも...。

どこのどういうコンテキストだったかよく覚えてないんだけど(mysqlのドキュメントだったかな?)、"next monday" みたいな表記も、当日が月曜だったときにどうするかの揺らぎがあるので、基準日を月曜以外にずらして使うのがいいよ、見たいなworkaround (というよりbad knowhow) が紹介されてた気がします。

未来までふまえてこの問題を一般的に語るのはむずかしいな、と思いました。