訪問者のタイムゾーン情報を収集するにはどうすればよいですか?タイムゾーンとGMTオフセット時間が必要です。
訪問者のタイムゾーン情報を収集するにはどうすればよいですか?タイムゾーンとGMTオフセット時間が必要です。
回答:
var offset = new Date().getTimezoneOffset();
console.log(offset);
タイムゾーンのオフセットは、UTCと現地時間の差(分単位)です。これは、ローカルタイムゾーンがUTCより遅れている場合はオフセットが正であり、進んでいる場合は負であることを意味します。たとえば、タイムゾーンがUTC + 10(オーストラリア東部標準時)の場合、-600が返されます。夏時間は、特定のロケールでもこの値が一定になるのを防ぎます
すべてのタイムゾーンが1時間単位でオフセットされるわけではないことに注意してください。たとえば、ニューファンドランドはUTCから3時間30分を引いたものです(夏時間は計算から除外されています)。
getTimezoneOffset
不正確さに関する記述は有効ですか?あなたが参照している記事は2007年6月の日付であり、関数がどのように不正確であるかについての詳細はありません。そして実際には、jsTimezoneDetect
あなたがポイントしたライブラリはgetTimezoneOffset
それ自体を使用します。
var hrs = -(new Date().getTimezoneOffset() / 60)
通常使用される時間単位でオフセットを取得する
timezone
!=utc offset
オフセットを使用してタイムゾーンを計算するのは間違ったアプローチであり、常に問題が発生します。タイムゾーンと夏時間のルールは、1年間に何度か変更される可能性があり、変更に対応するのは困難です。
JavaScriptでシステムのIANAタイムゾーンを取得するには、次を使用する必要があります
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0は、timeZone
コンストラクターに提供されない場合、未定義である可能性があると述べています。ただし、将来のドラフト(3.0)では、システムのデフォルトのタイムゾーンに変更することでこの問題を修正しました。
ECMAScript国際化APIのこのバージョンでは 、 コンストラクターに提供されたオプションオブジェクトにプロパティが指定されてい
timeZone
ない場合、timeZone
プロパティは未定義のままになりますIntl.DateTimeFormat
。ただし、将来のバージョンでは代わりにホスト環境の現在のタイムゾーンを識別する文字列値が返される可能性があるため、アプリケーションはこれに依存しないでください。
まだドラフトにあるecma-402 / 3.0では、
ECMAScript 2015国際化APIのこのバージョンでは 、コンストラクターに提供されたオプションオブジェクトにプロパティが指定されてい
timeZone
ない場合、timeZone
プロパティは デフォルトのタイムゾーンの名前になりますIntl.DateTimeFormat
。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
split[4] + " " + split[5]
!
split
は:["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
結果はDaylight Time)
new 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))
pad(parseInt(Math.abs(offset/60)), 2)
それを正しくするために最初のパディングをで置き換える必要があります...そうでなければ、私の場合のように+5.530を得るかもしれません...数学の床などがここでより良いものになるかどうかはわかりません...しかしこれはatleastが予想通り+0530を返す
以下を使用できます。
<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
オフセットとタイムゾーンの両方を提供するワンライナーは、新しい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
オブジェクトから取得される文字列が異なる場合があるため、この方法は特に役立ちます。単純な文字列スライスアプローチでは、複数のエンジンで一貫した結果が得られない場合があります。
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
moment().format('zz');
Z
あり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/dayjs@1.8.10/dayjs.min.js"></script>
どちらのAPIも、utcオフセットを分単位で返します。
getTimezoneOffset()
。
時間単位のタイムゾーン
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));
}
必要なのが「MST」または「EST」のタイムゾーン省略形の場合:
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。
この結果の演算子がTimezoneと反対であることを確認してください。いくつかの数学関数を適用してから、数値を検証してください。
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
?それfloor
はそうであるね?
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が理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。
これを試して、
new Date().toString().split("GMT")[1].split(" (")[0]
この値はユーザーのマシンからのものであり、いつでも変更できるので問題ではないと思います。おおよその値を取得し、サーバーで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');
()
日付の最後の値、つまりタイムゾーンの名前を取得します。
Date.toString()
は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。また、この回答はすでに3回以上出されています。
これは私の解決策です:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
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)
「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で動作します
Date.toString()
は信頼できません、そしてMDNが理由を説明します。私の回答に彼らのドキュメントから関連するセクションを貼り付けました。
あなたは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>
あなたは単にこれを試すことができます。現在のマシン時間を返します
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){}」