568


144

ユーザーのタイムゾーンを判断する

WebサーバーがWebページ内のユーザーのタイムゾーンを判断できるようにするための標準的な方法はありますか?

おそらくHTTPヘッダや `user-agent`文字列の一部から来たのでしょうか。

24 Answer


316


-new Date().getTimezoneOffset()/60;

メソッド `getTimezoneOffset()`はGMTからあなたの時間を引き、分数を返す。 あなたはGMT - 8に住んでいるのであれば、それは480を返します。

これを数時間にするには、60で割ります。 また、符号はあなたが必要とするものの反対であることに注意してください - それはあなたのタイムゾーンからのGMTのオフセットを計算します、あなたのタイムゾーンのGMTからのオフセットではありません。 これを修正するには、単に-1を掛けます。

また、http://www.w3schools.com/jsref/jsref_gettimezoneoffset.asp[w3school]には次のように記載されています。

_ 戻り値は定数ではありません。夏時間を使用するためです。 _


190


私の周りで見た時間帯を決定する最も人気のある(==標準?)方法は単に_ユーザ自身を隠すことです。あなたのウェブサイトが購読を必要とするなら、これはユーザのプロフィールデータに保存できます。 anonユーザーの場合、日付はUTCまたはGMT、あるいはそのようなものとして表示される可能性があります。

私はスマートアレックになろうとはしていません。 それはちょうど時々いくつかの問題がどんなプログラミング状況の外でより良い解決策を持っているということです。


95


これまでにクライアントのタイムゾーンを報告するHTTPヘッダーはありませんが、HTTP仕様に含めることが推奨されています。

私の場合は、クライアントサイドのJavaScriptを使用してタイムゾーンを取得し、それをAjaxなどを使用してサーバーに送信します。


54


JavaScriptは、クライアントの現地時間を知るための最も簡単な方法です。 私は XMLHttpRequestを使用して現地時間を返信することをお勧めします。それが失敗した場合は、IPアドレスに基づいて検出されたタイムゾーンに戻ります。

地理位置情報に関しては、いくつかのプロジェクトで MaxMind GeoIPを使用していますが、タイムゾーンデータが提供されているかどうかはわかりませんが、うまく機能します。 それはあなたが支払うサービスであり、彼らはあなたのデータベースに毎月の更新を提供します。 彼らはいくつかのWeb言語でラッパーを提供します。


49


これは、ブラウザが存在するタイムゾーンを判断するための堅牢なJavaScriptソリューションです。

>>> var timezone = jstz.determine(); >>> timezone.name(); "ヨーロッパ/ロンドン"


39


これがより完全な方法です。

  1. ユーザーのタイムゾーンオフセットを取得します

  2. 夏時間の境界で何日かテストして、それらが夏時間を使用するゾーンにあるかどうかを判断します。

抜粋は以下のとおりです。

function TimezoneDetect(){var dtDate = new Date( '1/1 /'(new Date())。getUTCFullYear()); var intOffset = 10000; //最初の試行で調整されるように初期オフセットを高く設定しますvar intMonth; var intHoursUtc; var intHours; var intDaysMultiplyBy;

//(intMonth = 0; intMonth <12; intMonth){//次の月に移動するdtDate.setUTCMonth(dtDate.getUTCMonth()1);

//夏時間を無視するには、最も小さいオフセットを探します。 //夏時間の間は時計が進むので、もっと大きい数値になります。 if(intOffset>(dtDate.getTimezoneOffset()*(-1))){intOffset =(dtDate.getTimezoneOffset()*(-1)); }}

intOffsetを返します。 }
https://web.archive.org/web/20140703082827/http://michaelapproved.com/articles/timezone-detect-and-ignore-daylight-saving-time-dst[JSからTZとDSTを取得]バックマシン)


31


まず、JavaScriptでのタイムゾーン検出は不完全であることを理解してください。 Date`オブジェクトのインスタンスで getTimezoneOffset`を使って特定の日時のローカルの_time zone offset_を取得できますが、これは完全なhttps://iana.org/time-zones[IANAとはまったく同じではありません。 America / Los_Angelesのように。

しかしうまくいくことができるいくつかのオプションがあります。

  • 最新のブラウザのほとんどは、実装でIANAタイムゾーンをサポートしています ECMAScript Internationalization APIので、これを行うことができます:+

const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;

結果は、コードが実行されているコンピュータのIANAタイムゾーン設定を含む文字列です。 サポートされている環境はhttps://kangax.github.io/compat-table/esintl/#test-DateTimeFormat_resolvedOptions().timeZone_defaults_to_the_host_environment [Intl compatibility table]に記載されています。 DateTimeFormat`セクションを展開し、 resolveOptions()。timeZoneのデフォルトはホスト環境に設定された機能を見てください。 * Luxonなどの一部のライブラリは、 このAPIは、 luxon.Settings.defaultZoneName`のような関数を通じてタイムゾーンを決定します。 * 古いWebなど、より幅広い環境をサポートする必要がある場合 ブラウザの場合は、ライブラリを使用して、タイムゾーンで「推測」を行うことができます。 利用可能であれば最初に `Intl APIを試し、それが利用可能でない場合は適切なタイムゾーンを選択するために結果を使って` Date`オブジェクトの `getTimezoneOffset`関数をさまざまな時点で調べます。内部データセットから。 jsTimezoneDetectとhttps://momentjs.com/timezone[moment-timezone]の両方にこの機能があります。

// using jsTimeZoneDetect
var tzid = jstz.determine().name();

// using moment-timezone
var tzid = moment.tz.guess();

どちらの場合も、結果は推測としか考えられません。 推測は多くの場合正しいかもしれませんが、それらすべてではありません。 さらに、これらのライブラリは定期的に更新して、古いJavaScript実装の多くが現地時間帯の_夏時間の規則を認識しているだけであるという事実を打ち消す必要があります。 https://codeofmatt.com/2013/06/07/javascript-date-type-is-horribly-broken/ [詳細については、ここをクリックしてください。]

最終的には、より良い方法は、実際にユーザーに自分のタイムゾーンを尋ねることです。 変更できる設定を指定してください。 上記のいずれかのオプションを使用して_default_設定を選択できますが、それをアプリケーションで変更できないようにしないでください。

ユーザーのコンピュータのタイムゾーン設定にまったく依存しないというまったく異なるアプローチもあります。 代わりに、緯度と経度の座標を収集できる場合は、https://stackoverflow.com/a/16086964/634824 [これらの方法のいずれか]を使用して、それらをタイムゾーンに解決できます。 これはモバイルデバイスではうまく機能します。


30


Unkwntechのアプローチを使って、jQueryとPHPを使って関数を書きました。 これはテスト済みで動作します。

タイムゾーンを変数として使用したいPHPページで、ページの上部付近に次のコードスニペットがあります。


これでセッション変数 "time"が読み取られ、これから作成しようとしています。

同じページで、


24


jQueryを使用してAJAXリクエストのHTTPヘッダーとしてタイムゾーンオフセットを送信するには

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
    }
});

http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/から `moment.tz.guess();`を使用して実際のタイムゾーン名を取得するのと同じようなこともできます。


22


私はまだここにタイムゾーンを取得する詳細な答えを見ていません。 IPアドレスでジオコーディングしたり、PHP(lol)を使用したり、オフセットから誤って推測したりする必要はありません。

まず、タイムゾーンはGMTからのオフセットではありません。 それは地域の基準によって時間規則が定められている土地の区域です。 一部の国では夏時間が設定されており、DSTのオン/オフは異なります。 現在のオフセットだけでなく、実際のゾーンを取得することが通常重要です。

あなたがこのタイムゾーンを保存するつもりなら、例えばユーザーの好みであなたはただのオフセットではなくゾーンが欲しいです。 リアルタイム変換の場合はそれほど重要ではありません。

さて、javascriptでタイムゾーンを取得するには、これを使うことができます。

>> new Date()。toTimeString(); "15:46:04 GMT 1200(ニュージーランド標準時)"
//Use some regular expression to extract the time.

しかしながら、私はOlsenフォーマットのタイムゾーンを返すこの堅牢なプラグインを単に使う方が簡単だとわかりました: