NodejsのDate関数が9時間ずれてしまうGMT対応

2017年12月27日

Nodejs テクノロジー プログラミング

朝起きたときに、本来起きなければ行けない時刻を過ぎていると、一気に目が冷めますよね。 どんなに寝起きが悪い人でも、寝起き時に寝坊と気がついた時の目の覚め様は、歌舞伎の早変わりのような素早さがあります。 これを回避しようと、事前に時計を10分ぐらい進めている人いますが、日々生活の中で時計が10分進んでいるから・・・と頭のなかで計算するクセが付いてしまい、朝起きてもまだ10分大丈夫というような怠け癖が付いてしまうのだそうです。 時計は正確にセットしておくことが重要なんですね。 そして、今回NodeJSを使ってとあるシステムを構築している時に、指定時刻の30分前の間を有効にするバッチ処理をプログラミングした時に、GMT設定がうまくいかず、強制的に行なう対応をしたので、ソースを載せておきます。

どんな不具合?

日付指定してある文字列を取得して、30分前、過ぎているという判別を行い、30分前の間だけを判定する時に、時刻の指定(判別)が正常に行えない。 ※9時間ずれる。 この時点で、インフラ管理を行っている人であれば、ピンとくると思いますが、サーバーのtimezone設定が日本時刻になっていないことが原因なんですね。 でも、サーバー管理者でなければ、Timezoneの設定を変更することが出来ない場合、GMT+9の設定のみ有効なソースコード対応と、サーバー側の設定対応の2つを行っておきます。

サーバー設定変更

サーバー設定が変更できる人は、この処理だけで問題解決します。 まず、下記のページを参照して、localeの設定を行います。 UbuntuのCUIで日本語ファイルを使う方法 | Tips of rubbish 次に、下記コマンドで作業完了です。 # localtimeの確認 $ strings /etc/localtime TZif2 TZif2 UTC0 # localtimeファイルのバックアップ $ cp /etc/localtime /etc/localtime.org # timezoneの切り替え $ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime #切り替え後の localtimeの再確認 $ strings /etc/localtime TZif2 JCST TZif2 JCST JST-9

ソースコードで対応

このプログラムはかなり力技で行なうやり方なので、利用する場合は、自己責任としてお使いください。 ;(function(){ // 現在日時の表示 console.log(new Date()); // 2017.12.23 12:00 var year = "2017"; var month = "12"; var day = "23"; var hour = "12"; var minite = "00"; var sec = "0"; var target = new Date(year, Number(month)-1, day, Number(hour), minite, sec).getTime(); var date = new Date().getTime(); // 差分を表示 console.log(target +" - "+ date +" = "+ ((target - date)/1000) +" sec"); })(); Timezone設定が正常にできていない環境で、このソースコードを実行すると、下記のようになります。 Sat Dec 23 2017 03:11:55 GMT+0000 (UTC) 1514030400000 - 1513998715946 = 31684.054 sec 明らかに9時間分足りていないので、下記ソースコードに変更してみます。 ;(function(){ // 現在日時の表示 console.log(new Date()); // 2017.12.23 12:00 var year = "2017"; var month = "12"; var day = "23"; var hour = "12"; var minite = "00"; var sec = "0"; var target = new Date(year, Number(month)-1, day, Number(hour), minite, sec).getTime(); var date = new Date().getTime(); // 9時間足す date += (60*60*9 *1000); // 差分を表示 console.log(target +" - "+ date +" = "+ ((target - date)/1000) +" sec"); })(); 結果は以下の通りです。 Sat Dec 23 2017 03:19:27 GMT+0000 (UTC) 1514030400000 - 1514031567306 = -1167.306 sec Timezonehはズレているんですが、強制的に9時間分の数値を追加して対応しています。 この時点での問題点は、正常なTimezoneの環境にもっていくと、逆に9時間ずれてしまいます。 なので、ピンポイントの環境であればいいのですが、汎用性の高いプログラムを構築しようとすると、タイムゾーンの判定をして、対応しなければいけません。 ていうか、やっぱり、サーバーのTimezone設定を正常にする事をオススメします。 大したソースコードではないのですが、そもそもわからない人の参考になればと思い記事にしておきました。 サーバーも寝起き用の目覚まし時計も正確にセットしましょうね。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。