タイムゾーンオフセットを取得する方法は知っていますが、「アメリカ/ニューヨーク」のようなものを検出する機能が必要です。それはJavaScriptからも可能ですか、それともオフセットに基づいて評価しなければならないことですか?
タイムゾーンオフセットを取得する方法は知っていますが、「アメリカ/ニューヨーク」のようなものを検出する機能が必要です。それはJavaScriptからも可能ですか、それともオフセットに基づいて評価しなければならないことですか?
回答:
国際化APIは、ユーザーのタイムゾーンの取得がサポートされ、サポートされ、現在のすべてのブラウザで。
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
国際化APIをサポートする一部の古いブラウザーバージョンでは、ユーザーのタイムゾーン文字列ではなくtimeZone
プロパティがに設定されていることにundefined
注意してください。私の知る限り、執筆時点(2017年7月)では、IE11を除くすべての現在のブラウザーは、ユーザーのタイムゾーンを文字列として返します。
最も投票された回答がおそらくタイムゾーンを取得する最良の方法Intl.DateTimeFormat().resolvedOptions().timeZone
ですが、定義ではIANAタイムゾーン名が英語で返されます。
現在のユーザーの言語でタイムゾーンの名前が必要な場合は、Date
の文字列表現から次のように解析できます。
function getTimezoneName() {
const today = new Date();
const short = today.toLocaleDateString(undefined);
const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });
// Trying to remove date from the string in a locale-agnostic way
const shortIndex = full.indexOf(short);
if (shortIndex >= 0) {
const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
// by this time `trimmed` should be the timezone's name with some punctuation -
// trim it from both sides
return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');
} else {
// in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
return full;
}
}
console.log(getTimezoneName());
ChromeとFirefoxでテスト済み。
もちろん、これは一部の環境では意図したとおりに機能しません。たとえば、node.jsはGMT+07:00
名前ではなくGMTオフセット(例:)を返します。しかし、私はそれがフォールバックとしてまだ読めると思います。
PSは、Intl...
ソリューションとしてIE11では機能しません。
このスクリプトを使用できます。 http://pellepim.bitbucket.org/jstz/
ここでリポジトリをフォークまたはクローンします。 https://bitbucket.org/pellepim/jstimezonedetect
スクリプトを含めると、タイムゾーンのリストをjstz.olson.timezones
変数に取得でき ます。
また、次のコードを使用して、クライアントブラウザのタイムゾーンを決定します。
var tz = jstz.determine();
tz.name();
jstzをお楽しみください!
名前でタイムゾーンを取得します(「アメリカ/ニューヨーク」など)
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
戻っていますundefined
が、moment.tz.guess()
正しい値を返します
こちらのマッピングテーブルを使用して、独自のコードを簡単に作成できます。http: //www.timeanddate.com/time/zones/
または、moment-timezoneライブラリを使用します:http : //momentjs.com/timezone/docs/
見る zone.name; // America/Los_Angeles
または、このライブラリ:https : //github.com/Canop/tzdetect.js
このコードをここから参照してみてください
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
var tz = jstz.determine(); // Determines the time zone of the browser client
var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.
alert(timezone);
});
</script>
javascriptでは、Date.getTimezoneOffset()メソッドは、現在のロケールのUTCからのタイムゾーンオフセットを分単位で返します。
var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;
Moment'timezoneは便利なツールです。 http://momentjs.com/timezone/
タイムゾーン間で日付を変換する
var newYork = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london = newYork.clone().tz("Europe/London");
newYork.format(); // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format(); // 2014-06-01T17:00:00+01:00