web-dev-qa-db-ja.com

JavaScriptを使用してタイムゾーンの略語を検出する

特定の日付オブジェクトのタイムゾーンを検出する方法が必要です。オフセットも、完全なタイムゾーン名も必要ありません。タイムゾーンの略語を取得する必要があります。たとえば、GMT、UTC、PST、MST、CST、ESTなど。

これは可能ですか?私が手に入れた最も近いのは、date.toString()の結果を解析することですが、それでも私に略語を与えることはありません。タイムゾーンの長い名前を教えてくれます。

38
spudly

他のすべてが失敗した場合は、単純に 長い名前と略語 を使用して独自のハッシュテーブルを作成できます。

7
Andy West

ネイティブソリューション:

var zone = new Date().toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2]
console.log(zone)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

52
Stephen DuMont

moment-timezone には、タイムゾーンの略語を返すドキュメント化されていないメソッド.zoneAbbr()が含まれています。これには、必要に応じて選択してダウンロードできる一連のルールも必要です。

これを行う:

<script src="moment.js"></script>
<script src="moment-timezone.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
    moment().tz("America/Los_Angeles").zoneAbbr();
</script>

戻り値:

'PDT' // As of this posting.

編集(2018年2月)

Evan Czaplickiは タイムゾーンAPIをブラウザに追加する提案案 に取り組んでいます。

16
absynce

[英語の書き方でごめんなさい]

こんにちは、日付オブジェクトにはタイムゾーンの短縮形を取得するメソッドがありませんが、toStringの戻り値のほぼ最後に暗黙的にあります。

例えば

var rightNow = new Date();
alert(rightNow);

出力は「Wed Mar 30 2011 17:29:16 GMT-0300(ART)」のようなものになるので、カッコで囲まれたものを分離できます。「ART」はタイムゾーンの短縮形です

var rightNow = new Date();
alert(String(String(rightNow).split("(")[1]).split(")")[0]);

出力は「ART」になります

答えるのが遅くなりますが、誰かに役立つことを願っています

16
Diego125k

これはChrome、Firefoxで完全に機能しますが、ほとんどはIE11でのみ機能します。 IE11では、「Indian Chagos Time」のような単純な略語のないタイムゾーンは、適切な「IOT」の代わりに「ICT」を返します

var result = "unknown";
try{
    // Chrome, Firefox
    result = /.*\s(.+)/.exec((new Date()).toLocaleDateString(navigator.language, { timeZoneName:'short' }))[1];
}catch(e){
    // IE, some loss in accuracy due to guessing at the abbreviation
    // Note: This regex adds a grouping around the open paren as a
    //       workaround for an IE regex parser bug
    result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[\(])","g")).join('');
}
console.log(result);

結果:

"CDT"
7
Charlie

2015年に更新:

jsTimezoneDetectmoment-timezone と一緒に使用して、クライアント側のタイムゾーン省略形を取得できます。

moment.tz(new Date(), jstz.determine().name()).format('z');  //"UTC"

これを処理するために使用されていた機能はすべての状況で機能しなかったため、Moment-timezoneはこれを単独で実行できません: https://github.com/moment/moment/issues/162 タイムゾーンの省略形のクライアント側を取得します。

2
Jordan

これは難しいテーマです。私が収集したタイムゾーンは、作成時にDateオブジェクトの一部として埋め込まれていません。 Dateオブジェクトのタイムゾーンも設定できません。ただし、ユーザーのホストシステム(タイムゾーン)設定によって決定されるDateオブジェクトから取得できるタイムゾーンオフセットがあります。タイムゾーンは、UTCからのオフセットを決定する方法と考えてください。

生活を楽にするために、 momentmoment-timezone これらのことを処理します。 Momentは、あらゆる種類のNice APIを使用してDateのラッパーオブジェクトを作成します。

既存の日付オブジェクトがパラメーターまたは何かを通じて提供される場合、瞬間オブジェクトを作成するときにコンストラクターに渡すことができ、ロールする準備ができています。この時点で、moment-timezoneはユーザーのタイムゾーン名を推測し、次に moment-timezone format を使用してタイムゾーンの略語を取得します。ほとんどのユーザーはタイムゾーンを自動的に設定しますが、100%の正確性のためにこれに頼るべきではありません。必要に応じて、必要な形式を取得する前に、使用するタイムゾーンを手動で設定することもできます。

一般に、日付と時刻を操作するときは、データベースにUTCを保存し、それを表示するときにユーザーのタイムゾーンの時刻をフォーマットするためにモーメントjsを使用するのが最善です。タイムゾーンが正しいことを確認する必要がある場合があります。たとえば、特定の日時に何かをスケジュールすることをユーザーに許可している場合。西海岸のユーザーの場合、データベースに保存するためにUTCに変換する前にタイムゾーンをPDT/PSTに設定することを絶対に確認する必要があります。

タイムゾーンの略語について...
これは、momentおよびmoment-timezoneを使用してタイムゾーンの略語を取得する基本的な例です。

// if all you need is the user's timezone abbreviation you don't even need a date object.
const usersTimezoneName = moment.tz.guess()
const timezoneAbbr = moment().tz(usersTimezoneName).format('z')
console.log(timezoneAbbr) // PST (depending on where the user is)

// to manually set the timezone
const newYorkAbbr = moment(dateObj).tz('America/New_York').format('z')
console.log(newYorkAbbr) // EST

特定のタイムゾーンのオフセットで特定の日付オブジェクトを表示するには、これを行うことができます。

const xmas = new Date('December 25, 2017 16:20:00')
const losAngelesXmas = moment(xmas).tz('America/Los_Angeles')
console.log(losAngelesXmas.format("dddd, MMMM Do YYYY, h:mm:ss a")) // Monday, December 25th 2017, 4:20:00 pm
1

ブラウザー間の違いの問題が残っていることは知っていますが、これは私がChromeで使っていたものです。ただし、Chromeは長い名前を返すため、まだ省略形ではありません。

new Date().toString().replace(/^.*GMT.*\(/, "").replace(/\)$/, "")
1
Gary

crossbrowserサポートについては、YUI 3ライブラリの使用をお勧めします。

Y.DataType.Date.format(new Date(), {format:"%Z"});

strftime 識別子をサポートします。

詳細: http://yuilibrary.com/yui/docs/datatype/#dates

1
Renato

私はほんの一瞬でこれを達成することができました。

moment.tz(moment.tz.guess()).zoneAbbr() //IST
1
vineeth61

GoogleのClosure Class goog.i18n.DateTimeSymbolsとそのロケール関連のクラスを試してください。

0
yannis

Vanilla JavaScriptでは不可能です。ブラウザはタイムゾーン文字列を返すことに関して一貫性がありません。 +0700などのオフセットを返すものもあれば、PSTを返すものもあります。

一貫性や信頼性がないため、moment.js(およびmoment-timezone.js)のようなサードパーティのスクリプトが必要な場合や、独自のハッシュテーブルを作成してオフセットとタイムゾーンの略語を変換する必要があります。

0
Jake Wilson

これはJavaScriptの自己更新式の12時間形式の日付/時刻表示で、質問にはまったく答えませんが、関連して構築されているため、他の人にとっては役立つ場合があります Stephen DuMont's solution and- [〜#〜] mdn [〜#〜] リンク。 W3 Schools には非常に役立つチュートリアルがあり、リアルタイムの更新にはページの更新は必要ありません。

デスクトップFireFox、Chrome、Opera、およびInternet Explorer 11の最新バージョンでのテストはすべて機能します。 「2桁」の時間は、IEの単一の値のゼロのプレフィックスとしてのみ表示されますが、分はすべてのブラウザで確実に2桁の値を返します。廃止されたWindows Safariでのテストは機能しますが、12時間形式は無視され、秒は非表示になりません。

この機能には、ローカルタイムゾーン、フォールバック言語、曜日と日付の表示、および12/24時間形式の調整可能なオプションが含まれます。日付と時刻が分割され、区切り文字「at」が追加されました。選択オプションで「toLocaleTimeString」のみを設定すると、日付と時刻の両方が返されます。 MDNページは、オプションと値について参照できます。

<!--
function dateTimeClock() {
  var date = new Date();
  document.getElementById('timedate').innerHTML = date.toLocaleDateString(['en-us', 'en-GB'], {
      weekday: 'long',
      month: 'long',
      day: '2-digit',
      year: 'numeric'
    }) + ' at ' +
    date.toLocaleTimeString(['en-us', 'en-GB'], {
      hour12: 'true',
      hour: '2-digit',
      minute: '2-digit',
      timeZoneName: 'short'
    });
  var t = setTimeout(dateTimeClock, 500);
}

function start() {
  dateTimeClock();
}
window.onload = start;
//-->
<div id="timedate"></div>
0
1keown