web-dev-qa-db-ja.com

ユーザーのタイムゾーンを取得

可能性のある複製:
Webユーザーのタイムゾーンを特定するにはどうすればよいですか?

これを行う最良の方法はどれですか? phpまたはjavascript。誰かが私にいくつかのスニペットを提供できますか?ありがとう。

41
andrei

これにより、タイムゾーンがPHP変数として取得されます。jQueryとPHPを使用して関数を作成しました。これはテストされ、機能します!

タイムゾーンを変数として使用するPHPページで、ページの上部近くに次のコードスニペットを配置します。

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

これは、今作成しようとしているセッション変数「time」を読み取ります。

同じページの<head>セクション、最初にjQueryを含める必要があります。

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

<head>セクション、このjQueryを貼り付けます。

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://domain.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

気づいたかもしれませんが、URLを実際のドメインに変更する必要があります。

最後に一つだけ。おそらく、timezone.phpが一体何なのか疑問に思うでしょう。まあ、これは単純です:(timezone.phpと呼ばれる新しいファイルを作成し、上記のURLでそれを指します)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

これが正常に機能する場合、最初にページをロードし、JavaScriptを実行して、ページをリロードします。これで、$ timezone変数を読み取って、それを自由に使用できるようになります!現在のUTC/GMTタイムゾーンオフセット(GMT -7)または現在のタイムゾーンを返します。

詳細については、私の blog をご覧ください。

乾杯

</Westy92>

57
Westy92

サーバー側では、JavaScriptほど正確ではありません。一方、時にはそのようなタスクを解決する必要があります。この場合の可能な解決策を共有するために、この答えを書きます。

ユーザーのタイムゾーンを決定する必要がある場合は、Geo-IPサービスを介して実行できます。それらのいくつかはタイムゾーンを提供します。たとえば、これは( http://smart-ip.net/geoip-api )助けになります:

<?php
$ip     = $_SERVER['REMOTE_ADDR']; // means we got user's IP address 
$json   = file_get_contents( 'http://smart-ip.net/geoip-json/' . $ip); // this one service we gonna use to obtain timezone by IP
// maybe it's good to add some checks (if/else you've got an answer and if json could be decoded, etc.)
$ipData = json_decode( $json, true);

if ($ipData['timezone']) {
    $tz = new DateTimeZone( $ipData['timezone']);
    $now = new DateTime( 'now', $tz); // DateTime object corellated to user's timezone
} else {
   // we can't determine a timezone - do something else...
}
33
Mikhus

オデッドが答えたように。 JavaScriptでこの種の検出機能を使用する必要があります。

私はこれに苦労し、オフセットだけでは十分ではないことに気付きました。たとえば、夏時間に関する情報は提供されません。最終的に、zoneinfoデータベースキーにマップするコードをいくつか書きました。

1年あたりのいくつかの日付をチェックすることにより、タイムゾーンをより正確に決定できます。

ここでスクリプトを試してください: http://jsfiddle.net/pellepim/CsNcf/

システムのタイムゾーンを変更し、実行をクリックしてテストするだけです。 chromeを実行している場合は、各タブで新しいテストを行う必要があります(タイムゾーンの変更を取得するにはsafarを再起動する必要があります)。

コードの詳細を確認するには: https://bitbucket.org/pellepim/jstimezonedetect/

11
Jon Nylander