web-dev-qa-db-ja.com

クライアントのタイムゾーンを取得する方法は?

Zend_Frameworkを使用してアプリケーションを作成しています(ソリューションがそれに依存できるように)。

クライアントのタイムゾーンを取得する方法は?

たとえば、ロシアのモスクワにいる誰かが3 * 60 * 60を取得したい場合(UTC + 3があるため)。彼が英国にいるなら、私はゼロが欲しい。彼がUTC-3:30(カナダ?)を使用する場合、-3.5 * 60 * 60が必要です。

(形式についての質問ではありません-ロシアのサンクトペテルブルクで「ヨーロッパ/モスクワ」または「UTC-3」を取得しても問題ありません。タイムゾーンのクライアント使用を取得することです。しかし、秒単位のデルタが好ましいです)

頭に浮かぶ唯一の解決策は、JavaScriptにローカル時間を取得させてリダイレクトすることです。

27
Valentin Golev

チェックアウト タイムゾーンの検出方法に関するこの記事 クライアントのタイムゾーンを保持するJavaScriptを介してCookieを設定します。かなり長いですが、それはかなり冗長だからです。私は自分のアプリのいずれかでこれらのラインに沿ってソリューションを実装しましたが、それは非常にうまく機能します。

また、Ajaxを介してタイムゾーンをサーバーに送信し、それを使用して必要な処理を実行することもできます。または、サーバー側の計算を行わない場合は、必要に応じてクライアント側のタイムゾーンを適用します。本当にあなたのユースケースに依存します。

それに加えて、訪問者が自分でタイムゾーンを設定し、Cookieまたはセッションに保存することをお勧めします。

8
Gordon

JQueryとPHPを使用して関数を作成しました。これはテストされており、機能します!

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

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

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

同じページので、まずjQueryを含める必要があります。

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

また、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)または現在のタイムゾーンを返します。

12
Westy92

これは、オーバーヘッドがほとんどないCookieソリューションです。

  echo <<<EOE
   <script type="text/javascript">
     if (navigator.cookieEnabled)
       document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
   </script>
EOE;
  if (!isset($_COOKIE['tzo'])) {
    echo <<<EOE
      <script type="text/javascript">
        if (navigator.cookieEnabled) document.reload();
        else alert("Cookies must be enabled!");
      </script>
EOE;
    die();
  }
  $ts = new DateTime('now', new DateTimeZone('GMT'));
  $ts->add(DateInterval::createFromDateString($_COOKIE['tzo'].' minutes'));
2
Bernhard Lauber