冬言響 / 日記

アメコミとか映画とか音楽とか猫とか単車とか自転車とか革とか銀とかジーンズとかブーツとか今日喰ったものとか。

RSS2.0

[JPEG画像]

チョーク開けずにエンジンかかったので今日から春。

CSS Naked Day 判定

こないだの続き。なんか時差とか日時関連の関数とかに関して正しく理解出来てない気がしてきた。ので、ちゃんと調べ直したりしてみんとす。

時差。地球は球形で自転してるので太陽が真上に来る時刻は地域によって差が出る。地球を 15 度ごとに 24 分割し、協定世界時 UTC からの差で「UTC+9」「UTC-12」のように表現する。日本は UTC+9 で、UTC±0 の英国より 9 時間早く 1 日が始まる。一番早く 1 日が始まるのは例えばキリバス共和国キリスィマスィ島で UTC+14(12 ではなく)。一番遅いのは米国領ベーカー島とかで UTC-12。

[PNG画像/4.7KB]

+14 なんて半端な数字になってるのは英国の真裏を都合良く縦に真っ直ぐ分割出来なかったから、と思。CSS Naked Day はこの地上のどこかが(今年なら)4 月 9 日である間は継続されるので、キリスィマスィ島で 4 月 9 日が始まってからベーカー島で終わるまでの 50 時間が Naked Day。なんか世間的には 48 時間てことになってるのだけどどうなんだろ。標準時の決め方に派閥とかあったりするんだろか。まあとりあえずここでは一番早いのは UTC+14 として話を進める。それに合わせて図も作っちゃったし。

日本基準で考えるならば日本時間で 4 月 9 日になる 5 時間前から始まって 50 時間継続。こないだのコードは間違ってたことがもうこの時点で確定してしまった訳で、とりあえず書き直してみると、

if(time() > (strtotime(CSSNAKEDDAY) - (60 * 60 * 5))
    && time() < (strtotime(CSSNAKEDDAY) + (60 * 60 * 45))) {
    // CSS 出力しない処理。
    echo("<!-- CSS Naked Day なのでスタイルシート出力されないぜヒャッハァー! -->\n");
    }

てトコなのだろうか。一応これでイケると思うのだけど、これは UTC+9 のタイムゾーンに設定されたサーバーでしか正しい結果は得られない。地球上のどこであってもその瞬間が CSS Naked Day であるか否かは正しく判定されてくれないと困るので(そんな困らんか)もう少し考えてみる。

time() 関数。現在の UNIX タイムスタンプを返す。これはグリニッジ標準時 1970 年 1 月 1 日 0 時 0 分 0 秒からの経過秒数で、先日めでたく「1234567890 秒」が過ぎ去ったことでも有名なアレ。これはある特定の瞬間に地上のどこのサーバーで求めても(時刻設定自体が間違ってなければ)同じ結果が返ってくる。

date() 関数。第 1 引数として与えられたフォーマット文字列で、第 2 引数として与えられた(省略時はその時点の)タイムスタンプをフォーマットし、返す。ローカル時間で返ってくるので、例えば「Y-m-d H:i:s」というフォーマットに前述の「1234567890」を入れると、英国では「2009-02-13 23:31:30」が、日本では「2009-02-14 08:31:30」が返ってくる。

地域 A と別の地域 B との時差の秒数を time() の返り値から引いて、地域 A のタイムゾーンに設定されたサーバで date() 関数に入れると地域 B での時刻を知ることが出来る。日本と英国の時差は +9 時間 = +32,400 秒なので、

date("Y-m-d H:i:s", time() - 32400);

で、英国の時刻が出る。

この「32400」という値は、 date() 関数のフォーマット文字列として「Z」を入れることで得られる。UTC+1 の地域ならば「3600」という値が返ってくるし、UTC-2 の地域では「-7200」が返ってくる。ので、

date("Y-m-d H:i:s", time() - date("Z"));

としてやればどのタイムゾーンのサーバであってもその時点での英国の時刻が得られる。さらに

date("Y-m-d H:i:s", time() - date("Z") - (60 * 60 * 14));

で UTC+14 の地域(例えばキリスィマスィ島)の、

date("Y-m-d H:i:s", time() - date("Z") + (60 * 60 * 12));

ならば UTC-12 の地域(ベーカー島)の時刻が得られる。

という訳で、

及び、前者が終了して後者が始まるまでに 2 時間の空白が生じてしまうのでそれをカバーする意味で

という 3 つの命題の論理和が真であるときに CSS Naked Day 判定が入るようにすれば、

it will be "April 9th" somewhere in the world

をより直接的にプログラム言語に翻訳したと言えるのではないだろうかとかなんとかゴニョゴニョ。

// 日付を定義。
define("CSSNAKEDDAY", "2009-04-09");
// 判定。
if(date("Y-m-d", time() - date("Z") - (60 * 60 * 14)) == CSSNAKEDDAY
    || date("Y-m-d", time() - date("Z")) == CSSNAKEDDAY
    || date("Y-m-d" time() - date("Z") + (60 * 60 * 12)) == CSSNAKEDDAY) {
    // CSS 出力しない処理。
    echo("<!-- ヒャッハァー! -->\n");
    }

どうだろう。

なんとなく追記。CSS Naked Day のサイトに判定用コードが載ってるのはちゃんと判ってるけど例によって「自分で考えてみるのが肝要」の精神でゴニョゴニョやってみました、ってことでひとつ。