ほぼ日刊サービス開発日誌

React, firebase, 機械学習など

sponsored

ユーザーが設定したアラート時刻をjavascriptで【世界標準時ミリ秒】に直してリモートサーバーに保存して実行するには

f:id:serendipity4u:20180920174732p:plain

問題

アラートアプリを作っていました。

ユーザーは自分のタイムゾーン設定に合わせて時刻を決定できます。

クライアントサイドの時間設定は人それぞれなので、そのまま保存してしまうとリモートサーバーでの実行時間が不明瞭です。

リモートサーバーでタイムゾーン設定を扱わなくて良いようにするためにはどうしたら良いか?を考えました。

時刻文字列をパースしたときに返ってくる数字とは?

msec = Date.parse("Thu, 06 Sep 2012 00:00:00 +0900"); // 1346857200000
msec = Date.parse('2018-09-20 1:00:00') // 1537372800000

まずこの1346857200000みたいな数字ってなんやねんというところですが

世界協定時 1970 年 1 月 1 日 00:00:00 から数えて経過したミリ秒なのだそうです。

サーバーサイドではSQLで時刻を並べ替えたりしたいので、

扱いやすいミリ秒に直して保存するのが筋が良さそうです。

最終的な仕様

悩んだ結果

  • ユーザーはクライアントサイドの時間設定によって時刻を入力
  • ユーザー入力時間をミリ秒形式に変更
  • 上記ミリ秒に世界標準時との差分を加算、減算
  • サーバーサイドに送る

という仕様にすることにしました。

スクリプト

var current = new Date();

Date.parse(日時文字列) + current.getTimezoneOffset() * 60000

これで世界標準時からの経過時間ミリ秒が出力できます。

getTimeZoneOffset()はローカル コンピューターの時刻と世界協定時刻 (UTC) との差を分単位の値で取得するメソッドです。