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


615

訪問者のタイムゾーン情報を収集するにはどうすればよいですか?タイムゾーンとGMTオフセット時間が必要です。


3
私は今、同じ問題を突き止めています。ここに興味深いアプローチがあります。
タマシュのPap

31
タイトルはタイムゾーンを要求し、テキストはGMTオフセットを要求します。これらは2つの異なるものです。タイムゾーンにはDSTに関する情報が含まれますが、utcオフセットには含まれません。タイムゾーンには名前と履歴がありますが、オフセットにはありません。タイトルを「JSでクライアントのgmtオフセットを取得する」に編集することをお勧めします。
シティキッド2013

タイムゾーンが必要です。GMTオフセットも役に立ちます。
DaveWalley、2014年

9
ここでの答えは主にオフセットに焦点を当てています。以下のための時間帯参照この答えをタイムゾーンタグwikiの「タイムゾーン!=オフセット」を参照してください。
Matt Johnson-Pint 2015年

7
このIntl.DateTimeFormat()。resolvedOptions()。timeZoneを使用して正確なタイムゾーンを取得します
Mangesh Mandavgane 2018年

回答:


594

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

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

すべてのタイムゾーンが1時間単位でオフセットされるわけではないことに注意してください。たとえば、ニューファンドランドはUTCから3時間30分を引いたものです(夏時間は計算から除外されています)。


42
@abernier getTimezoneOffset不正確さに関する記述は有効ですか?あなたが参照している記事は2007年6月の日付であり、関数がどのように不正確であるかについての詳細はありません。そして実際には、jsTimezoneDetectあなたがポイントしたライブラリはgetTimezoneOffsetそれ自体を使用します。
マイク

5
@abernierこれはES 1以降の標準なので、実装の問題は今では解決されていると思います。つまり、これは7年前の記事です。
LasagnaAndroid 2014年

49
var hrs = -(new Date().getTimezoneOffset() / 60) 通常使用される時間単位でオフセットを取得する
エドウィンダニエルズ

6
夏時間は考慮されていないようです
Shahdat

21
timezone!=utc offset
bendytree 2017

483

オフセットを使用してタイムゾーンを計算するのは間違ったアプローチであり、常に問題が発生します。タイムゾーンと夏時間のルールは、1年間に何度か変更される可能性があり、変更に対応するのは困難です。

JavaScriptでシステムのIANAタイムゾーンを取得するには、次を使用する必要があります

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

2019年9月現在、これは世界で使用されているブラウザの95%で動作します

古い互換性情報

ecma-402 / 1.0は、timeZoneコンストラクターに提供されない場合、未定義である可能性があると述べています。ただし、将来のドラフト(3.0)では、システムのデフォルトのタイムゾーンに変更することでこの問題を修正しました。

ECMAScript国際化APIのこのバージョンでは 、 コンストラクターに提供されたオプションオブジェクトにプロパティが指定されていtimeZoneない場合、timeZoneプロパティは未定義のままになりますIntl.DateTimeFormat。ただし、将来のバージョンでは代わりにホスト環境の現在のタイムゾーンを識別する文字列値が返される可能性があるため、アプリケーションはこれに依存しないでください。

まだドラフトにあるecma-402 / 3.0では、

ECMAScript 2015国際化APIのこのバージョンでは 、コンストラクターに提供されたオプションオブジェクトにプロパティが指定されていtimeZoneない場合、timeZoneプロパティは デフォルトのタイムゾーンの名前になります Intl.DateTimeFormattimeZoneこの場合、以前のバージョンでは プロパティが未定義のままでした。


17
これは、タイムゾーンを取得するための唯一の答えです。オフセットのみではなく、一部のユーザーが必要とする場合があります。したがって、2016-09の更新として、Intlはほとんどの最新のブラウザーで機能しますが、Safariでは機能しません。そのブラウザについては、ここにかなり正確なJavaScriptフォールバックがあります-pellepim.bitbucket.org/jstz
user2085368

6
これがSafariで機能するように見えることを確認しました。(バージョン10.0使用)
BadPirate

2
これがすべての最新のブラウザで機能すればいいのですが。ただし、IE11と最新のFirefoxはどちらも、timeZoneプロパティに対して未定義を返します。
Haprog 2017

7
私は今、Chrome 58、Edge 40、Firefox 53でテストしましたが、すべて動作します。IE 11では動作しません。Operaはテストしていません。
須磨

8
このAPIから返されるタイムゾーンのリストを見つけるのにしばらく時間がかかりました。ここにあります:en.wikipedia.org/wiki/List_of_tz_database_time_zones
Xavier Poinas

123

私はこの回答が少し外れたトピックであることを理解していますが、回答を探している多くの人がタイムゾーンを表示用にフォーマットし、おそらくゾーンの省略形も取得したいと考えていると思います。だからここに行く...

適切にフォーマットされたクライアントのタイムゾーンが必要な場合は、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


4
タイムゾーンの名前を追加するため、Chromeで壊れます。代わりにsplit.lengthではなく定数を使用しないでくださいsplit[4] + " " + split[5]
Christophe Roussy 2013年

4
これも(驚き、驚き)IEでは機能しません。分割されたDateオブジェクトのコンソールダンプを実行しました。Chrome、Firefox、Safariは同じですが、IEは異なります。したがって、定数インデックスも当てにできません。2013年12月2日月曜日10:22:50 GMT-0500(EST):Chrome、FF、Safari; 2013年12月2日10:22:50 EST 2013:IE10
adimauro

1
まあありがとう!私はブラウザのタイムゾーンを表示しようとするフープをジャンプしてきました... ew Date()。toString()。match(/([AZ] + [\ +-] [0-9] +。*)/)[ 1]はまさに私が必要としていたものでした!
KiwiSunGoddess、2015年

1
これは機能しません。私にとってsplitは:["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]結果はDaylight Time)
次のとおり

7
これは実際には良い考えではありません。実行後のJS時間の実際の表現は、new Date().toString()ロケール設定に完全に依存しています。他のクライアントの出力をあなたの出力に似せることは非常に悪い考えです。
Octopus

71

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

1
あなたはpad(parseInt(Math.abs(offset/60)), 2)それを正しくするために最初のパディングをで置き換える必要があります...そうでなければ、私の場合のように+5.530を得るかもしれません...数学の床などがここでより良いものになるかどうかはわかりません...しかしこれはatleastが予想通り+0530を返す
Abhinav Singh

まさに私が探していたもの。よろしくお願いします!
コードスヌーカー

これは正しい結果になります: this.pad(Math.floor((Math.abs(offset / 60)))、2)
Vivek

パッド関数を使用する代わりに、これを行う方が簡単だと思います:offset =(offset <0? "+": "-")+( "0000" + parseInt((Math.abs(offset / 60)))) .slice(-4)
フルビウス

67

以下を使用できます。

モーメントタイムゾーン

<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

12
これは受け入れられる答えになるはずです。これは、オフセットではなく実際のタイムゾーンを与える唯一のものです。タイムゾーンオフセットは名前から導出できることに注意してください。逆は当てはまりません。DSTおよびその他の微妙な理由により、複数のタイムゾーンが同じオフセットを持つことができるのは、その年の特定の日だけです。
Romain G

1
このためのネイティブソリューション-Intl APIがあります。当時、moment.jsは優れたライブラリでしたが、現在のところはるかに小さい代替手段があります(dayjsdate-fns)。瞬間は巨大です。クライアントアプリケーションにはお勧めしません。
Dan Dascalescu

43

プロジェクトにタイムゾーンを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

フィドル


1
ありがとうございました!これは私が必要なものです!
Jeremy Moritz、

15

オフセットとタイムゾーンの両方を提供するワンライナーは、新しいDateオブジェクトでtoTimeString()を呼び出すだけです。MDNから:

このtoTimeString()メソッドは、Dateオブジェクトの時刻部分をアメリカ英語の人間が読める形式で返します。

問題は、タイムゾーンが標準のIANA形式ではないことです。「大陸/都市」IANA形式よりもやや使いやすいです。やってみて:

console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);

現在、カリフォルニアでtoTimeString()Pacific Daylight Time、Intl APIがを返すのに戻りますAmerica/Los_Angeles。コロンビアでは、あなたが取得したいColombia Standard Time、対をAmerica/Bogota

この質問に対する他の多くの回答は、Date.toString()を呼び出して同じ情報を取得しようとしていることに注意してください。MDNが説明するように、そのアプローチはそれほど信頼できません。

日付インスタンスは特定の時点を参照します。toString()を呼び出すと、人間が読める形式でフォーマットされた日付がアメリカ英語で返されます。[...]時間部分の文字列を取得することが望ましい場合があります。このようなことはtoTimeString()メソッドで達成できます。

形式は実装に依存しているためtoTimeString()、ECMA-262を実装する準拠エンジンtoString()Dateオブジェクトから取得される文字列が異なる場合があるため、この方法は特に役立ちます。単純な文字列スライスアプローチでは、複数のエンジンで一貫した結果が得られない場合があります。


13

試みgetTimezoneOffset()Date対象:

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

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


9

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);


3
この答えは、以前の答えが持っていないことを提供していますか?
Dan Dascalescu

7

moment.js

moment().format('zz');

6
z及びzz1.6.0参照のことのよう推奨されていませんmomentjs.com/docs/#/displaying/format
MrUpsidown

3
@MrUpsidownそれは今でZありZZ
brauliobo

4
@braulioboこれらのパラメーターは同じものを返しません。zとzzはタイムゾーン(CSTなど)を返しましたが、ZとZZはオフセット(例:-0600)を返しました。
Luca Spiller、2015年

および最新のドキュメントショー.zoneAbbr()が置き換えられました。こちらのドキュメントをご覧くださいzzz
tabish89 '20

1
当時、moment.jsは優れたライブラリでしたが、現在のところはるかに小さい代替手段があります(dayjsdate-fns)。瞬間は巨大です。クライアントアプリケーションにはお勧めしません。
Dan Dascalescu

6

、現在のタイムゾーンは

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>


、現在のタイムゾーンは

console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>

どちらのAPIも、utcオフセットを分単位で返します。


当時、moment.jsは優れたライブラリでしたが、現在のところはるかに小さい代替手段があります(dayjsdate-fns)。瞬間は巨大です。クライアントアプリケーションにはお勧めしません。
Dan Dascalescu

1
「dayjsを使用すると、現在のタイムゾーンを見つけることができます」は正確ではありません。タイムゾーンではなく、オフセットのみを見つけることができます。また、Dayjsはタイムゾーンをサポートしていません。その.utcOffset()メソッドは、ネイティブの単純なラッパーですgetTimezoneOffset()
Dan Dascalescu

4

時間単位のタイムゾーン

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));
}


ベネズエラのように1時間ではないタイムゾーンでは機能しません。ベネズエラではGMT-4.5を返します
Mirko

はいそうです。0.5は0.5 * 30分を意味します。なぜ0.5を与えているのですか?
Abrar Jahin 2017年

はい、そのためGMT-4.5は有効なタイムゾーンではありません。GMT-4:30になるには、追加の解析が必要です
Mirko

@ミルコの答えの2番目の部分はあなたのためです
Abrar Jahin

より正確にしたい場合は、GMTの代わりにUTCを使用してください[Hilton and McCarthy 2013、p。231–2。]、ウィキペディアGMTも参照-(en.wikipedia.org/wiki/Greenwich_Mean_Time
トムカッシェル、

3

必要なのが「MST」または「EST」のタイムゾーン省略形の場合:

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

使用Date.toString()は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。
Dan Dascalescu

3

この結果の演算子がTimezoneと反対であることを確認してください。いくつかの数学関数を適用してから、数値を検証してください。

ここに画像の説明を入力してください

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

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

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

console.log(res)


1
負の値の場合、いくつかの問題
Arun Prasad ES

1
なんでround?それfloorはそうであるね?
Qwertiy、2018

3
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;
}

例:2018年6月21日木曜日18:12:50 GMT + 0530(インド標準時)

O / P:+0530


使用Date.toString()は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。
Dan Dascalescu


2

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

new Date()あなたが行うことができ、タイムゾーン名を取得するには、オフセットを得ることができます:

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

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


使用Date.toString()は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。また、この回答はすでに3回以上出されています。
Dan Dascalescu

2

これは私の解決策です:


    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    
    console.log(`${timeZone}, ${offsetHours}hrs`);

1

new Date().getTimezoneOffset()およびの代替としてmoment().format('zz')、次を使用することもできます

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


当時、moment.jsは優れたライブラリでしたが、現在のところはるかに小さい代替手段があります(dayjsdate-fns)。瞬間は巨大です。クライアントアプリケーションにはお勧めしません。
Dan Dascalescu

1

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

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

-2

「PDT」のような3文字の文字列だけを探していて、マルケスの答えを試しましたが、クロスブラウザーサポートのために少し調整する必要がありました。幸い、文字列は最後に一致する可能性があります:)

CoffeeScriptで私がやったことは次のとおりです。

browserTimezone = ->
  userDate = new Date()
  zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
  userZone = zoneMatches[zoneMatches.length - 1]

IE8、IE9、Safari 9、Firefox 44、およびChrome 48で動作します


2
ただし、4文字のタイムゾーンがあります。注意してください。たとえばCEST(中央ヨーロッパ夏時間)
jbrosi

使用Date.toString()は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。
Dan Dascalescu

-3

あなたはmoment.jsとjstz.jsを含めるだけです

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>

それとその後

<script>
$(function(){
 var currentTimezone = jstz.determine();
 var timezone = currentTimezone.name();
 alert(timezone);
});

</script>

-3

これは私にとってとても良い仕事です:

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;

1
説明はありますか?

-4

あなたは単にこれを試すことができます。現在のマシン時間を返します

var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())


これはどのように行うべきかを考えたものですnew Date(new Date().getTime()); 。「Fri Dec 28 2018 2018 10:15:23 GMT + 0100(Central European Standard Time){}」
darmis

-4

これでうまくいきます。


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

未定義

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.