Zend_Frameworkを使用してアプリケーションを作成しています(ソリューションがそれに依存できるように)。
クライアントのタイムゾーンを取得する方法は?
たとえば、ロシアのモスクワにいる誰かが3 * 60 * 60を取得したい場合(UTC + 3があるため)。彼が英国にいるなら、私はゼロが欲しい。彼がUTC-3:30(カナダ?)を使用する場合、-3.5 * 60 * 60が必要です。
(形式についての質問ではありません-ロシアのサンクトペテルブルクで「ヨーロッパ/モスクワ」または「UTC-3」を取得しても問題ありません。タイムゾーンのクライアント使用を取得することです。しかし、秒単位のデルタが好ましいです)
頭に浮かぶ唯一の解決策は、JavaScriptにローカル時間を取得させてリダイレクトすることです。
チェックアウト タイムゾーンの検出方法に関するこの記事 クライアントのタイムゾーンを保持するJavaScriptを介してCookieを設定します。かなり長いですが、それはかなり冗長だからです。私は自分のアプリのいずれかでこれらのラインに沿ってソリューションを実装しましたが、それは非常にうまく機能します。
また、Ajaxを介してタイムゾーンをサーバーに送信し、それを使用して必要な処理を実行することもできます。または、サーバー側の計算を行わない場合は、必要に応じてクライアント側のタイムゾーンを適用します。本当にあなたのユースケースに依存します。
それに加えて、訪問者が自分でタイムゾーンを設定し、Cookieまたはセッションに保存することをお勧めします。
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)または現在のタイムゾーンを返します。
これは、オーバーヘッドがほとんどない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'));