ユーザーに予約の日時を入力して、その1時間前にリマインダーを送信してもらいたい。
サーバーでは日時をUTCで保存したいのですが、クライアントではユーザーが現地時間で入力します。この変換に対処するための最良の方法は何ですか?これをネイティブにサポートするプラグインはありますか?
ユーザーに予約の日時を入力して、その1時間前にリマインダーを送信してもらいたい。
サーバーでは日時をUTCで保存したいのですが、クライアントではユーザーが現地時間で入力します。この変換に対処するための最良の方法は何ですか?これをネイティブにサポートするプラグインはありますか?
はい、システム情報(jsTimezoneDetect)に従ってタイムゾーンを検出するプラグインがあります。実際には、date
オブジェクト自体が情報を格納します(ただし、これはちょっと奇妙です!)。
SOには興味深い記事と興味深い答えがあります。これは一読の価値があります。
javascriptで日時の計算を行わないでください。ブラウザのタイムゾーンを推測して定義することもできますが、定義自体とすべての日時の計算は、タイムゾーンに対応したシステムで行う必要があります。
この記事を読むと、「javascriptのdate / dst / utc / timezones」の問題をより深く理解できるようになります。したがって、サーバー側について詳しく教えていただければ興味深いと思います。
「正しい」アプローチ(バックエンドが背後にある場合はフェイルセーフ)は次のようになります。ユーザーが日時を操作できるようにします。ブラウザスコープでは、多かれ少なかれ「未定義」です(タイムゾーンを見つける必要はありません。オフセット、または同様のもの!)。ここで、この「未定義」の日時情報をサーバーに提供します(たとえば、隠しフィールドを含むunix-timestampをサーバーに送信します)。ここには、ユーザーが割り当てられている実際のタイムゾーンに関する情報があります。したがって、この「未定義」の日時情報をサーバー側のタイムゾーン対応の日時オブジェクトに変換し、アカウントスコープの情報をそれに割り当てることができます(「未定義」の日時オブジェクトには現地時間があります)。 -ゾーン-例:「太平洋夏時間」)。これで、必要な変換を簡単に行うことができます。
このアプローチの唯一の欠点は、タイムゾーン(ユーザーとWebアプリのOS)を定義する2つのスコープがあることですが、それ以外のものは手間がかかり、フェイルセーフではありません!
getTimezoneOffset
UTC日付/時刻クライアント側を計算する方法を使用して、タイムスタンプをサーバーに送信することをお勧めします。タイムスタンプを送信するクライアント側に戻すには、ダミーの日付クライアント側を作成して現在のタイムゾーンオフセットを決定し(ユーザーが別のタイムゾーンに移動した可能性があります!)、その情報からクライアント側の日付を作成します。クライアント側では、次のようなことを行います。
//[client side send]
var d = new Date(), //now
offset = d.getTimezoneOffset()
UTCTimeStamp = d.getTime()+(60000*offset); // send to server
//[client side receive]
var offset = 60000*new Date().getTimezoneOffset(),
localDate = new Date(timestamp + (offset < 0 ? Math.abs(offset) : -offset));
このアイデアを使用して簡単なテストを行うには、ここをクリックしてください。