サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(8)-javascriptで夏時間
- 公開日: 2014/07/27(日) 12:54[JST]
ブログなんかの作成/更新日時は日本時間で管理するつもりだが、「現地時間も併記できるとカッコいいよね」と思った次第。ささやかながら英語のコンテンツもあるしね。
表示できるようにしたいのは以下の3点。
作成/更新日時の現地時間
作成/更新日時の時差
その日時が夏時間中であるかどうか
あまりクライアントサイドのプログラミングって詳しく無いけど(むろんサーバサイドもせいぜいカジュアルレベルだけどそれ未満)、javascriptにうってつけの機能があるみたい。
DateオブジェクトのgetTimezoneOffset()メソッドがそれで、Dateオブジェクトが指す日時に対する標準時への時間差を分単位で示してくれるようだ(+09:00の日本時間なら-540)。夏時間かどうかを判別するルーチンがabout.comにあったのでそれをそのままありがたく使わせてもらおう。
Date.prototype.stdTimezoneOffset = function() { var jan = new Date(this.getFullYear(), 0, 1); var jul = new Date(this.getFullYear(), 6, 1); return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); } Date.prototype.dst = function() { return this.getTimezoneOffset() < this.stdTimezoneOffset(); }
srdTimezoneOffsetメソッドは、Dateオブジェクトが示す日時と同年における「夏時間でないときの」時差を検出するルーチン。今のところ、夏時間のある所では一月一日と七月一日の時差が必ず異なるようになっているとのことなので、これの大きい方を取り出すことで夏時間でないときの時差を取り出せる。dstメソッドは、Dateオブジェクトが示す時差とその年における「夏時間で無いときの」時差を比較して、後者が大きいとき(Dateが示す日時が夏時間中であるとき)にTrueを返すルーチン。
Date.prototype.outputFmtdDate = function() { var weekdays = ['日', '月', '火', '水', '木', '金', '土']; var monthdata = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']; var year = String(this.getFullYear()); var month = monthdata[this.getMonth()]; var day = weekdays[this.getDay()]; var date = String(this.getDate()); var hour = String(this.getHours()); var minute = String(this.getMinutes()); var second = String(this.getSeconds()); var offsetText, outputText; var offsetMinute = this.getTimezoneOffset(); if (offsetMinute <= -600){ offsetText = "+" + String(offsetMinute * (-1) / 60) + ":" + String(offSetMinute * (-1) % 60); }else if (offsetMinute < 0){ offsetText = "+0" + String(offsetMinute * (-1) / 60) + ":" + String(offSetMinute * (-1) % 60); }else if (offsetMinute >= 600){ offsetText = "-" + String(offsetMinute / 60) + ":" + String(offSetMinute % 60); }else{ offsetText = "-0" + String(offsetMinute / 60) + ":" + String(offSetMinute % 60); } outputText = year + "/" + month + "/" + date + "(" + day + ") " + hour + ":" + minute + ":" + second + "[" + offsetText + "]"; if (this.dst()){ outputText += "(DST)"; } return outputText; }
で、このようなメソッドを作ってみた。このメソッドの返り値は"yyyy/m/d H:M:S[時差]"形式の日時テキストで夏時間の時は末尾に"(DST)"が入るという寸法。まだテストしてないけど。