訪問者のタイムゾーン情報を収集する方法タイムゾーンとGMTのオフセット時間が必要です。
var offset = new Date().getTimezoneOffset();
console.log(offset);
タイムゾーンオフセットは、UTCと現地時間の差(分単位)です。これは、ローカルタイムゾーンがUTCより遅れている場合はオフセットが正であり、進んでいる場合は負であることを意味します。たとえば、タイムゾーンがUTC + 10(オーストラリア東部標準時)の場合、-600が返されます。夏時間により、特定のロケールでもこの値が一定にならない
すべてのタイムゾーンが1時間でオフセットされているわけではないことに注意してください。たとえば、NewfoundlandはUTCから3時間30分マイナスしたものです(夏時間は式の範囲外になります)。
タイムゾーンを計算するためにオフセットを使用することは間違ったアプローチであり、あなたはいつも問題に遭遇するでしょう。タイムゾーンと夏時間の規則は、1年のうちに数回変更される可能性があり、変更に追いつくのは困難です。
システムの IANAタイムゾーン をJavaScriptで取得するには、次のようにします。
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
2019年3月現在、この 世界中で使用されているブラウザの90%で動作します 。 Internet Explorer では not が動作します。
ecma-402/1.0は、コンストラクタに提供されていない場合、timeZone
は未定義になる可能性があると述べています。しかし、将来のドラフト(3.0)では、システムのデフォルトのタイムゾーンに変更することでこの問題を修正しました。
このバージョンのECMAScript国際化APIでは、
Intl.DateTimeFormat
コンストラクタに提供されるoptionsオブジェクトにtimeZone
プロパティが指定されていない場合、timeZone
プロパティは未定義のままになります 。ただし、将来のバージョンでは代わりにホスト環境の現在のタイムゾーンを識別するString値が返される可能性があるため、アプリケーションはこれに依存しないでください。
まだドラフトの中にあるecma-402/3.0ではそれはに変更されました
このバージョンのECMAScript 2015国際化APIでは、
Intl.DateTimeFormat
コンストラクターに提供されるoptionsオブジェクトにtimeZone
プロパティーが提供されていない場合、timeZone
プロパティーはデフォルトのタイムゾーンの名前になります。この場合、以前のバージョンではtimeZone
プロパティは未定義のままでした。
私はこの答えがちょっとした話題ではないことを認識していますが、答えを探している私たちの多くはタイムゾーンを表示用にフォーマットし、おそらくゾーンの省略形も手に入れたいと思ったと思います。だからここに行きます...
クライアントのタイムゾーンを適切にフォーマットしたい場合は、JavaScriptのDate.toStringメソッドを使用して次のことを行えます。
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
該当する場合は、タイムゾーンの分を含めて、たとえば「GMT-0400(EST)」と表示されます。
あるいは、正規表現を使用して、必要な部分を抽出することができます。
"GMT-0400(EDT)"の場合:
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
"GMT-0400"の場合:
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
ただ "EDT"の場合:
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
"-0400"だけの場合
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Date.toStringリファレンス: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
整数で分単位でオフセットを取得する方法は既に回答されていますが、ローカルGMTオフセットを文字列として取得する場合は、次のように入力します。 "+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
あなたが使用することができます:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
ブラウザのタイムゾーン検出は、ブラウザから提供される情報がほとんどないため、正しく理解するのがやや難しいです。
Moment Timezoneは、ブラウザ環境について可能な限り多くの情報を収集するために、今年の頃にDate.getTimezoneOffset()
とDate.toString()
を使用します。次に、その情報をロードされたすべてのタイムゾーンデータと比較し、最も近いものを返します。同点の場合は、人口が最も多い都市のタイムゾーンが返されます。
console.log(moment.tz.guess()); // America/Chicago
私は自分のプロジェクトでタイムゾーンをhh:mm
フォーマットで返す関数を書きました。これが誰かに役立つことを願っています。
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// See output
document.write(getTimeZone());
Date
オブジェクトのgetTimezoneOffset()
を試してください。
var curdate = new Date()
var offset = curdate.getTimezoneOffset()
このメソッドは、GMTと現地時間の差であるタイムゾーンオフセットを分単位で返します。
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
moment.js :付き
moment().format('zz');
momentjs を使用すると、現在のタイムゾーンを次のように見つけることができます。
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
dayjs を使用すると、現在のタイムゾーンを次のように見つけることができます。
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/[email protected]/dayjs.min.js"></script>
どちらのAPIも、分単位でのUTCオフセットを返します。
時間帯のタイムゾーン -
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
あなたがコメントで述べたように正確になりたいのであれば、あなたはこのように試すべきです -
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
この結果の演算子がTimezoneと反対であったことを確認してください。何らかの数学関数を適用してから、numを1以上有効にします。
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
必要なのが "MST"または "EST"タイムゾーンの省略形だけであれば、
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
オフセットとタイムゾーンの両方を提供するワンライナーは、新しいDateオブジェクトで toTimeString() を呼び出すことです。 MDNから:
toTimeString()
メソッドは、Dateオブジェクトの時間部分をアメリカ英語の人間が読める形式で返します。
問題は、タイムゾーンが標準のIANAフォーマットではないということです。 "continent/city" _ iana _ 形式よりもややユーザーフレンドリーです。やってみよう:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
現在カリフォルニアでは、Intl APIがPacific Daylight Time
を返すのに対し、toTimeString()
はAmerica/Los_Angeles
を返します。コロンビアでは、Colombia Standard Time
に対してAmerica/Bogota
が表示されます。
この質問に対する他の多くの回答では、Date.toString()を呼び出して同じ情報を取得しようとしています。 MDNが説明するように、そのアプローチはそれほど信頼できません :
日付インスタンスは特定の時点を参照します。 toString()を呼び出すと、アメリカ英語の人間が読める形式の日付が返されます。 [...]時系列の文字列を取得することが望ましい場合があります。そのようなことは
toTimeString()
メソッドで達成することができます。フォーマットは実装に依存するため、ECMA-262を実装する準拠エンジンは
Date
オブジェクトに対してtoTimeString()
から取得される文字列が異なる場合があるため、toString()
メソッドは特に便利です。単純な文字列スライス手法では、複数のエンジンにわたって一貫した結果が得られない場合があります。
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
例:Thu Jun 21 2018 18:12:50 GMT + 0530(インド標準時)
O/P:+ 0530
この値はユーザーのマシンからのものであり、いつでも変更できますので、問題にはならないと思います。おおよその値を取得してからサーバーでGMTに変換したいだけです。
たとえば、私は台湾出身で、私には "+ 8"を返します。
_ js _
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
_ html _
<div id="result"></div>
結果
+8
new Date(
)ではオフセットを取得できます。タイムゾーン名を取得するには、次のようにします。
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
日付の終わりの()
の間の値、つまりタイムゾーンの名前を取得します。
new Date().getTimezoneOffset()
とmoment().format('zz')
の代わりに、 momentjs を使うこともできます。
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezoneもバグが多く保守されていません( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
これを試して、
new Date().toString().split("GMT")[1].split(" (")[0]
これを使用して、OffSetを正に変換します。
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
私はたった3文字の文字列( "PDT"のような)を探してMarquezの答えを試したが、クロスブラウザサポートのためにそれを少し微調整しなければならなかった。幸いなことに、文字列は最後にマッチする可能性があります:)
これが、CoffeeScriptで私がしたことです。
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
IE 8、IE 9、Safari 9、Firefox 44、およびChrome 48で動作します。