7

IPアドレスまたは国名から(「アジア/カルカッタ」)のようなタイムゾーン地域を取得するためにPHPで利用できる方法があるかどうか誰か教えてください。

説明:

国に基づいてユーザーのタイムゾーンを設定しようとしています。私は彼のIPアドレスからユーザーの国を取得していますが、その国でDSTがオンになっているかどうかを確認するには、その国のタイムゾーン地域(「アジア/カルカッタ」)が必要です。誰かがPHPで適切なソリューションを提供してもらえますか?

4

4 に答える 4

5

IP アドレスの使用

タイムゾーンは、風変わりなルールに従う場合があります。IP ジオロケーションは正確とは言えません (一部のベンダーの主張にもかかわらず)。

そうは言っても、MaxMind のような Geo IP 製品を使用して都市と国を確実に見つけることができます。

http://www.maxmind.com/app/geolite

PHPモジュールを含む

http://www.maxmind.com/app/php

その後、MaxMind API を使用して、ユーザーのタイムゾーンを試して推定することができます

http://www.maxmind.com/app/faq#timezone

IP アドレスではなくユーザーの時計に依存したい場合、jsTimezoneDetect は非常にうまく機能します (完全ではありませんが)。

https://bitbucket.org/pellepim/jstimezonedetect/wiki/Home

概要

いずれの手法も、すべての場合で完全には機能しません。ユーザーが自動生成されたタイムゾーンの提案を修正できるようにしてください。

于 2012-06-27T05:09:39.530 に答える
1

ユーザークライアントの設定に基づいて、どのタイムゾーンが設定されているかを確認することをお勧めします。たぶん、ユーザーがタイムゾーンにいるという状況がありますが、それは彼が望んでいないことです。

簡単な可能性の1つはユーザーに尋ねることですが、それは簡単です。

JavaScriptを使用すると、UTCから数分でオフセットを見つけることができます。また、クライアントが夏時間(DST)のある国にいて、dstがアクティブであるかどうかを確認することもできます。これは、2つの日付オブジェクトの時刻を比較することで実行できます。1つは月、もう1Januaryつは月Julyです。

var dst1, dst2, expires, hemisphere, now;

now = new Date(); expires = new Date(); dst1 = new Date(); dst2 = new Date();

expires.setTime(now.getTime() + 31536000000);
setCookie('timezone_offset', now.getTimezoneOffset(), expires, '/');

dst1.setDate(1);
dst1.setMonth(1);
dst2.setDate(1);
dst2.setMonth(7);

if (parseInt(dst1.getTimezoneOffset()) === parseInt(dst2.getTimeZoneOffset())) {
  setCookie('timezone_dst', 0, expires, '/');
} else {
  hemisphere = parseInt(d1.getTimezoneOffset()) - parseInt(d2.getTimezoneOffset());
  if ((hemisphere > 0 && parseInt(d1.getTimezoneOffset()) === parseInt(now.getTimezoneOffset())) || (hemisphere < 0 && parseInt(d2.getTimezoneOffset()) === parseInt(now.getTimezoneOffset()))) {
    setCookie('timezone_dst', '0', expires, '/');
  } else {
    setCookie('timezone_dst', '1', expires, '/');
  }
}

PHPでCookieを読み取り、timezone_name_from_abbr()でそれらの情報を解釈します。

$timezone = timezone_name_from_abbr('', $_COOKIE['timezone_offset'] * 60, $_COOKIE['timezone_dst']);
于 2012-06-27T06:04:35.303 に答える