サーバーが常にHTMLでUTCで日付を提供し、クライアントサイトのJavaScriptでユーザーのローカルタイムゾーンに変換するようにしたい。
ユーザーのロケールの日付形式で出力できる場合はボーナス。
サーバーが常にHTMLでUTCで日付を提供し、クライアントサイトのJavaScriptでユーザーのローカルタイムゾーンに変換するようにしたい。
ユーザーのロケールの日付形式で出力できる場合はボーナス。
次のように、UTC から日付文字列を解析することをお勧めします (すべてのブラウザーで一貫した結果を得るには、サーバー上にISO-8601互換の文字列を作成します)。
var m = moment("2013-02-08T09:30:26Z");
アプリケーションで使用するだけm
で、moment.js のデフォルトは表示操作のローカル タイムゾーンになります。日付と時刻の値をフォーマットしたり、その一部を抽出したりする方法は多数あります。
次のように、ユーザー ロケールでモーメント オブジェクトをフォーマットすることもできます。
m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us
moment.js オブジェクトを別のタイムゾーン (つまり、ローカルタイムゾーンでも UTC でもないタイムゾーン) に変換するには、moment.js タイムゾーン拡張機能が必要です。そのページにはいくつかの例もあり、使い方はとても簡単です。
注: Moment JS はより最新の代替手段を推奨しているため、新しいプロジェクトには適していない可能性があります。
new Date().getTimezoneOffset()/60
タイムゾーンに使用できます。toLocaleString()
ユーザーのロケールを使用して日付を表示する方法もあります。
リスト全体は次のとおりです。日付の操作
日付オブジェクトを構築したら、変換のスニペットを次に示します。
この関数は、UTC 形式の Date オブジェクトと形式文字列を受け取ります。プロトタイプ
が必要になります。Date.strftime
function UTCToLocalTimeString(d, format) {
if (timeOffsetInHours == null) {
timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
}
d.setHours(d.getHours() + timeOffsetInHours);
return d.strftime(format);
}
過去のプロジェクトで使用したものは次のとおりです。
var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set. again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');
この.getTimezoneOffset()
メソッドは、GMT/UTC タイムゾーンから「西方向」を数えて分単位でタイムゾーン オフセットを報告するため、一般的に慣れ親しんでいるオフセット値よりも負のオフセット値が得られます。(例: ニューヨーク時間は +240 分または +4 時間と報告されます)
通常のタイムゾーン オフセットを時間単位で取得するには、次を使用する必要があります。
var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60
重要な詳細:
夏時間が結果に含まれることに注意してください。したがって、この方法で得られるのは、実際の時間オフセットであり、実際の地理的なタイム ゾーンオフセットではありません。
ユーザーのローカルタイムゾーン形式でdbからの日時文字列を表示するには、それらすべてを読み、しばらくの間さらに調査する必要があったため、これまでの回答を混ぜて追加しました。
日時文字列は、2016-12-05T15:12:24.215Z の形式で python/django db から取得されます。
JavaScript でのブラウザー言語の確実な検出は、すべてのブラウザーで機能するとは限らないようです (ブラウザー言語設定を検出するための JavaScript を参照)。そのため、サーバーからブラウザー言語を取得します。
Python/Django: ブラウザ言語のリクエストをコンテキスト パラメータとして送信:
language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })
HTML: 非表示の入力に書きます:
<input type="hidden" id="browserlanguage" value={{ language }}/>
JavaScript: en-GB,en-US;q=0.8,en;q=0.6/ などの非表示の入力の値を取得し、置換と正規表現のみを使用してリストの最初の言語を取得します
const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");
JavaScript: datetime に変換してフォーマットします:
var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);
結果は (ブラウザの言語は en-gb): 05/12/2016, 14:58
以下を使用できます。これは、GMT からのタイムゾーン オフセットを分単位で報告します。
new Date().getTimezoneOffset();
注 : - この関数は負の数を返します。
私が見つけた最善の解決策は、[time display="llll" datetime="UTC TIME" /] タグを作成し、javascript (jquery) を使用して解析し、ユーザーの時間に対して相対的に表示することです。
http://momentjs.com/ Moment.js
時刻をきれいに表示します。
getTimeZoneOffset() と toLocaleString は基本的な日付処理に適していますが、実際のタイムゾーンのサポートが必要な場合は、mde の TimeZone.jsを参照してください。
この質問への回答で説明されているオプションがいくつかあります
ロケールを行う方法がわかりませんが、javascript はクライアント側のテクノロジです。
usersLocalTime = new Date();
その中にクライアントの時刻と日付が含まれます (ブラウザによって報告され、さらにクライアントが座っているコンピュータによって報告されます)。サーバーの時間を応答に含めて、簡単な計算を行って時間オフセットを推測するのは簡単です。