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