web-dev-qa-db-ja.com

JavaScriptでクライアントのタイムゾーンオフセットを取得する

訪問者のタイムゾーン情報を収集する方法タイムゾーンとGMTのオフセット時間が必要です。

var offset = new Date().getTimezoneOffset();
console.log(offset);

タイムゾーンオフセットは、UTCと現地時間の差(分単位)です。これは、ローカルタイムゾーンがUTCより遅れている場合はオフセットが正であり、進んでいる場合は負であることを意味します。たとえば、タイムゾーンがUTC + 10(オーストラリア東部標準時)の場合、-600が返されます。夏時間により、特定のロケールでもこの​​値が一定にならない

すべてのタイムゾーンが1時間でオフセットされているわけではないことに注意してください。たとえば、NewfoundlandはUTCから3時間30分マイナスしたものです(夏時間は式の範囲外になります)。

492
NickFitz

タイムゾーンを計算するためにオフセットを使用することは間違ったアプローチであり、あなたはいつも問題に遭遇するでしょう。タイムゾーンと夏時間の規則は、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プロパティは未定義のままでした。

303
Pawel Dubiel

私はこの答えがちょっとした話題ではないことを認識していますが、答えを探している私たちの多くはタイムゾーンを表示用にフォーマットし、おそらくゾーンの省略形も手に入れたいと思ったと思います。だからここに行きます...

クライアントのタイムゾーンを適切にフォーマットしたい場合は、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

116
Marquez

整数で分単位でオフセットを取得する方法は既に回答されていますが、ローカル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))
69
cryo

あなたが使用することができます:

瞬間タイムゾーン

<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
55
Sameer Ek

私は自分のプロジェクトでタイムゾーンを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());

Working Fiddle

36
Mr_Green

DateオブジェクトのgetTimezoneOffset()を試してください。

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

このメソッドは、GMTと現地時間の差であるタイムゾーンオフセットを分単位で返します。

12
dfa

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
9
زياد

moment.js :付き

moment().format('zz');
6
kolypto

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オフセットを返します。

5
Fizer Khan

時間帯のタイムゾーン -

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));
}
4
Abrar Jahin

この結果の演算子がTimezoneと反対であったことを確認してください。何らかの数学関数を適用してから、numを1以上有効にします。

enter image description here

MDNのドキュメントを参照してください

var a = new Date().getTimezoneOffset();

var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;

console.log(res)
3
prasanth

必要なのが "MST"または "EST"タイムゾーンの省略形だけであれば、

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}
3
JohnP2

オフセットとタイムゾーンの両方を提供するワンライナーは、新しい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()メソッドは特に便利です。単純な文字列スライス手法では、複数のエンジンにわたって一貫した結果が得られない場合があります。

3
Dan Dascalescu
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

3

この値はユーザーのマシンからのものであり、いつでも変更できますので、問題にはならないと思います。おおよその値を取得してからサーバーで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
2
Terry Lin

new Date()ではオフセットを取得できます。タイムゾーン名を取得するには、次のようにします。

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

日付の終わりの()の間の値、つまりタイムゾーンの名前を取得します。

2
Moysés Lacerda

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

1
brauliobo

これを試して、

new Date().toString().split("GMT")[1].split(" (")[0]
1

これを使用して、OffSetを正に変換します。

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
1
Kumal Pereira

私はたった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で動作します。

0
ari gold