JavaScriptで「毎週◯曜日」を全世界のローカル時間で表示

thumbnail

このブログは英語と日本語で切り替えれるように設計している。 一応、グローバルに発信しているつもり・・・。 そこで問題になるのが、時差だ。

ブログパーツで「毎週日曜日に更新」と表記している。 しかし、日本では毎週日曜日に更新されているとしても、サンフランシスコでは毎週土曜日に更新されていることになる。 ということで、読む人のタイムゾーン設定に合わせて表記を調整する必要がある。

協定世界時間

昔はイギリスにあるグリニッジ天文台をもとに、世界標準時を決めていた。 この時間がGMTと呼ばれる時間だ。

しかし、現在ではもっと精度の高いセシウム原子時計が使われるようになった。 これがUTCと呼ばれる時間だ。 日本はUTC+9だ。

表記

24時間表記はミリタリータイムと呼ばれ、世界的にも使われるが、AM/PMの方が一般的だ。 15時と言っても、海外の人はパッと分からないことがある。

全体の流れ

まずは設定したい時間を日本時間で出す。 僕は午前11時55分にした。

それをこちらのサイトで協定世界時間に変換できる。 午前2時55分になった。

この時間をDateオブジェクトにセットして、ローカル時間に変換して日付や時間をゲットしてやればOK。

計算方法

今月のカレンダーを用意した。 本日は16日なので、日曜日は3日後の19日だ。 ということで、Dateオブジェクトを作成して、それを3日間進めてやればいい。

Dateオブジェクトでは曜日を数値で表す。

0 1 2 3 4 5 6

例えば、月曜から水曜までなら、 3 - 1 = 2 で、2日間だとわかる。

しかし、木曜から日曜だと、 0 - 4 = -4 で、マイナスになってしまう。

一週間後の日曜日を( 0 + 7 )として計算すると、 ( 0 + 7 ) - 4 = 3 ちゃんと3日間というのが出る。

しかし、月曜から水曜を同じ方法で計算すると、 ( 3 + 7 ) - 1 = 9 9日経ったら、次の水曜日ではなく、二週間後の水曜日になってしまう。 この計算はいつでも成り立つわけではない。

じゃあ、7で割った余りを出してみよう。 modは割って余りを出すときに使われる記号だ。

木曜から日曜:
{ ( 0 + 7 ) - 4 } mod 7 = 3
月曜から水曜:
{ ( 3 + 7 ) - 1 } mod 7 = 2

これなら二パターンともうまくできた。 これを一般化すると、 { ( 次の◯曜日 + 7 ) - 今日の曜日 } mod 7 = ◯日間

プログラム

以上のことをJavaScriptで表すと、以下のようになる。

var days = [
  "日曜日",
  "月曜日",
  "火曜日",
  "水曜日",
  "木曜日",
  "金曜日",
  "土曜日"
];

var today = new Date();
var tdy = today.getUTCDay(); // 協定世界時間に基づく今日の曜日
var tdt = today.getUTCDate(); // 協定世界時間に基づく今日の日付

var release_date = new Date();
release_date.setUTCHours(2); // 先程のサイトで変換したリリース時間
release_date.setUTCMinutes(55); // 先程のサイトで変換したリリース分
release_date.setUTCDate( ( 0 + 7 ) - tdy ) % 7 + tdt ); // 引数の中が31を超えたりしても、調整される

alert( release_date.getFullYear() + ' ' + ( release_date.getMonth() + 1 ) + '/' + release_date.getDate() + '(' + days[release_date.getDay()] + ') ' + release_date.getHours() + ':' + release_date.getMinutes() ); 

僕は英語圏からのアクセスは曜日の名前を英語にするようにPHPで実装している。

確認

僕はフィリピンにいるので、11時55分の1時間前の10時55分になった。 次に時間をアメリカに変えて確認してみる。

上部のバーの時間をクリックして時刻設定を開く。

変更するためにクリックしてパスワードを入力。

チェックを外す。

適当な場所をクリック! これで時間設定が変わった。

土曜日になっている。