14

そのため、コメントのタイムスタンプがMySQLデータベースに保存されているコメント機能を備えたサイトがあります。私の理解では、タイムスタンプは保存時にUTCに変換され、取得時にデフォルトのタイムゾーンに変換されます。私の場合、サーバーは中部夏時間帯(CDT)にあります。

エントリーフォームを介して各ユーザーからタイムゾーンを取得する予定です。TIMESTAMP値をユーザーのタイムゾーンに変換する方法を知りたかっただけです。

  • まず、UTCからローカルタイムゾーンに変換しますか?またはCDTからローカルタイムゾーンへ?
  • 次に、PHPでそれを行うにはどうすればよいですか?私はただしますか:
$ userTimezone = new DateTimeZone($ userSubmittedTimezoneString);
$ myDateTime = new DateTime($ StoredTimestamp、$ userTimezone);

...またはそれは正しくありませんか?

4

4 に答える 4

21

日付/時刻/日時の値は、指定したとおりに MySQL に保存されます。つまりINSERT、文字列2012-04-17 12:03:23を列に入れるとDATETIME、それが格納される値になります。内部でタイムスタンプに変換されますが、これは正確である場合とそうでない場合があります (以下を参照)。ただし、値を再度クエリすると、同じ値が返されます。往復は透過的です。

SQL 内で時間計算を行おうとすると、問題が発生する場合があります。つまり、SQL でタイムゾーンやサーバー時間を考慮する必要がある操作です。たとえば、 を使用しNOW()ます。これらの操作のいずれについても、タイムゾーンおよび/またはサーバー時刻を正しく設定する必要があります。タイム ゾーンの問題を参照してください。

それが問題ではなく、PHP で計算するだけでよい場合は、どのタイムゾーンからどのタイムゾーンに変換したいかを確認するだけで済みます。そのために、すべての時間を UTC に標準化すると便利ですが、変換元のタイムゾーンが明確である限り、任意のタイムゾーンから他のタイムゾーンへのタイムゾーン変換も同様に機能するため、必須ではありません。そしてへ。

date_default_timezone_set('Asia/Tokyo'); // your reference timezone here

$date = date('Y-m-d H:i:s');

/* INSERT $date INTO database */;

$date = /* SELECT date FROM database */;

$usersTimezone = new DateTimeZone('America/Vancouver');
$l10nDate = new DateTime($date);
$l10nDate->setTimeZone($usersTimezone);
echo $l10nDate->format('Y-m-d H:i:s');
于 2012-04-17T03:55:57.703 に答える
1

ユーザーのタイムゾーンを取得する信頼できる方法はありません。タイムゾーン情報は HTTP ヘッダーでは送信されません。あなたができる最善のことは、次のいずれかです。

  1. IP アドレスを地理データベースと照合する - または -
  2. Javascript を使用して、ユーザーのコンピューターに設定された時刻を取得し、それをサーバー (AJAX) に送信するか、クライアントで時刻文字列を作成します。
于 2012-04-17T02:37:12.683 に答える
0
$timezone = new DateTimeZone('America/Vancouver');

$date = new DateTime(date('m/d/Y h:i:s a', time()));
$date->setTimeZone($timezone);
echo $date->format('l F j Y g:i:s A')."\n";

new DateTime(date('m/d/Y h:i:s a', time()));と置き換えますnew DateTime("UTC Time");

DateTimeZone()ユーザー入力ごとに新しいオブジェクトを作成できます。

于 2012-04-17T03:23:50.177 に答える
0

その方法は、javascript を使用することです。これを行う最善の方法は、ユーザーの GMT を Cookie に保存し、それを PHP プロセス フォームで取得することだと思います。

<script language="javascript">

function TimeZoneCookie()
{
 var u_gmt = (-(new Date().getTimezoneOffset()))/60;
 var o_date = new Date("December 31, 2025");
 var v_cookie_date = o_date.toGMTString();
 var str_cookie = "utimezone="+u_gmt;
 str_cookie += ";expires=" + v_cookie_date;
 document.cookie=str_cookie;
}
//---------------------
TimeZoneCookie();

</script>

u_gmt説明:

  1. Date().getTimezoneOffset()GMT-0 へのオフセットを分単位で返します
  2. getTimezoneOffset()はオフセットを GMT-0からではなくGMT -0 に戻すため、それを元に戻す必要があります。どのように?それを知っているだけで簡単です-*-=+& -*+=-. 基本的な数学を知っている場合は、すでにこの原則を知っています。
  3. ステップ 1 で述べたようにgetTimezoneOffset()、オフセットは分単位で返されるので、それを 60 で割るだけで、gmt オフセット形式を取得できます。

結果: (-(new Date().getTimezoneOffset()))/60


PHP で Cookie を取得します。

<?php

$user_timezone = $_COOKIE['utimezone'];

?>
于 2012-04-17T03:28:24.107 に答える