JavaScript:タイムゾーン情報を取得します。

UTCでサーバーに時間を保存し、ページが発行されたときにユーザーのローカル時間に変換すると便利な場合があります。 私が参加しているプロジェクトでは、少なくともそのようなタスクが発生しました。 utcから現地時間への翻訳は簡単な作業ではありませんが、多くの情報と公開されたアルゴリズムがあります。 必要なのはクライアントのタイムゾーンのデータだけですが、結局のところ、それほど多くの情報はありません。



以下に公開されているものはすべて、当社独自の開発の結果です





 var now = new Date();

関数SheckDLT(sm、em) 
   {
    return((新しい日付(em))。getTimezoneOffset()-(新しい日付(sm))。getTimezoneOffset());
   }

関数getTZLowerBound(開始、終了、cmp)
   {
    var nstart、count、count2;
    count = end-start;

    while(count> 0)
      {
       end = start + count;
       nstart = start +(count2 = Math.floor(count / 2));
       if(cmp(CheckDLT(nstart、end)))
         {
          start = nstart + 1;
         カウント-= count2 + 1;
         }
      他に
         count = count2;
      }
    return [start、-(新しい日付(開始))。getTimezoneOffset()];
   }

 var dlt = Date.UTC(now.getFullYear()、0、1、0、0、0、0)、
 std = Date.UTC(now.getFullYear()、6、1、0、0、0、0);

 if(SheckDLT(dlt、std))
   {
    dlt = getTZLowerBound(dlt、std、function(b){return(b <0)});
    std = getTZLowerBound(Date.UTC(now.getFullYear()、6、1、0、0、0、0)、
                         Date.UTC(now.getFullYear()、11、1、0、0、0、0)、 
                         function(b){return(b> 0)});
    dlt [0] = dlt [0] + std [1] * 60000;
    std [0] = std [0] + dlt [1] * 60000;
   }
他に
   std = dlt = [0、-now.getTimezoneOffset()];




これは、このコードの実行結果です。 出力では、2つの配列dltとstdを取得します。 最初のものには夏時間への移行点に関するデータが含まれ、2番目には標準へのデータが含まれます。 各配列の最初の要素は、現地時間での移行ポイントのタイムスタンプであり、2番目の要素は、移行後のGMTに対するオフセットです。 クライアントのタイムゾーンに夏時間がない場合、両方の配列の最初の要素はゼロになり、2番目の要素はGMTオフセットになります



もちろん、これらのデータに基づいて、現時点では多くの交差点があるため、クライアントのタイムゾーンを明確に決定することはできませんが、過去には矛盾があります。 それでも、自動時間変換に使用する場合、これで十分です。




All Articles