JavaScriptとタイムゾーン-サイトの適切な時間

サイトでの現地時間の実装に関しては依然として混乱があります。 この混乱に対するかなりの貢献は、ロシアの議員によって、冬時間への移行が定期的に中止されたことによってなされました。 これで、現在のタイムゾーンが+3または+4時間であることがわかりますか? そのため、ほとんどのユーザーはこれを知りません。 しかし、この問題でユーザーに負担をかけないための非常に簡単な解決策があります! デバイスの時刻を使用する必要があります(これが正しいローカル時刻であると想定します)。 javascript getTimezoneOffset関数を使用するという明確な決定は根本的に間違っています。 なんで? 読んでください。



すべてがどのように機能しますか? たとえば、ユーザーが12:15のフォーラム(デバイスの時間まで)にメッセージを送信すると、同じ時間にサイトでメッセージが表示されます。 タイムゾーンオフセット(getTimezoneOffsetからブラウザーから取得)を使用すると、すべてが機能するはずです。 しかし、これはそうではありません!



パラドックスは、ユーザーのデバイスでタイムゾーンが正しく設定されていない可能性があることです。 これは非常に一般的なケースです。タイムゾーンを変更すると、多くの場合、タイムゾーンに触れることなく時間を数時間に転送するだけです。 その結果、テクニカルサポートフォーラム「時間の設定」に無限のブランチがあり、冬時間/夏時間のシフトごとに、または休日からの帰りの期間中に咲きます。



最も正しいことは、タイムゾーンに注意を払うことなく、ユーザーのデバイスに設定された時間に従ってサイトの現地時間を設定することです。 サーバーでは、すべての日付がGMT形式でデータベースに保存されていると想定しています(これは正しいです)。 したがって、ユーザーのブラウザーで日付(時刻)を正しく表示するには、ブラウザーとサーバーの時刻の間のオフセットを計算する必要があります。



サーバーでは、phpの現在の時刻はtime()関数で取得でき、ブラウザーではjavascript Date()関数で取得できます。 そして、タイムゾーンのオフセットは、次のようなjavacriptを使用して計算できます。



//  time_zone     var d = new Date(); var loc = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()); var time_zone = ((<? echo time();?> - loc/1000)/60).toFixed(0);
      
      





次に、time_zone値をサーバーに転送し、このオフセットを考慮してデータベースからの時間を表示する必要があります。 たとえば、時間が秒単位でデータベースに保存されている場合、ブラウザへの出力には次を使用します(php):



 //      -    $t = $time_fromDB - $time_zone*60;
      
      





上記の2段階の方法:

1.最初に、time_zoneが計算されます

2. time_zoneはサーバーに送信され、さらに時間を出力するために使用されます



ただし、すべてを1つのステップで実行できます。 この場合、ページが最初にブラウザーにロードされるときにtime_zoneも計算され(上記を参照)、javacriptを使用してすべての時間値が表示されます。 たとえば、関数mydate()を使用する場合:



 function two(num) { return ("0" + num).slice(-2);} //    // t -       // mydate      12.08.2015 19:03 function mydate(t) { var d = new Date((t-time_zone*60)*1000); return two(d.getUTCDate())+'.'+ two(d.getUTCMonth()+1)+'.'+d.getUTCFullYear()+' '+ two(d.getUTCHours())+':'+ two(d.getUTCMinutes()); }
      
      





上記のすべてがメッセンジャープロジェクトで使用され、すべてのブラウザーとオペレーティングシステム(モバイルおよびデスクトップ)で実証されています。 ここで指定されたアルゴリズムの無制限の使用は、プロジェクトで可能です。 ソースコード内のプロジェクトmagdialog.ruへのリンクを歓迎します。



All Articles