1

ユーザーベースは英国ベースですが、ドメインは米国ベースであるため、データベースのタイムゾーンを変更する方法を検討しています。PHP、PEAR タイム クラス、MySQL 関数など、さまざまなオプションを調査しました。私にとって最も簡単なのは (MySQL で始まり、MySQL で終わるため)、MySQL の time_zone パラメータを変更することです。

これを行う準備として、MySQL の @@global.time_zone 呼び出しを試してみました (操作を開始する前に、これを理解しておく必要があります)。予想していなかった大量のパラメーターが生成され、MySQL のサイト (リンク テキスト) は言及されていません。タイムゾーンに関係するものを返すパラメーター。

これについての経験はありますか?アドバイスできますか?よろしくお願いします。

4

2 に答える 2

1

タイムゾーンを処理するには、次の2つの鍵があります。

  1. すべての日付/時刻を同じタイムゾーンに保存します(任意のタイムゾーンにすることができますが、UTCを使用すると作業が簡素化されます)。

  2. アプリケーションの日付/時刻をストレージタイムゾーンからユーザー表示タイムゾーンに変換する場所を決定します。これは、データベース抽象化レイヤー、アプリケーションコード、またはページテンプレート(基本的にMVCスタックの任意の部分)で実行できます。重要なことは一貫性を保つことです。

また、phpにはMySQLとは独立した独自のタイムゾーン設定があることを忘れないでください。php> 5.1を実行している場合は、date_set_default_timezone()を使用して実行時にphpタイムゾーンを変更できます。

データベースに情報を取得/保存するときにタイムゾーン変換を行うことにした場合、MySQLのconvert_tz()関数が新しい親友になります。

私にとっては、ページテンプレートの一部としてタイムゾーン変換を行うのが最も簡単でした。日付/時刻はUTCタイムゾーンでデータベースに保存され、すべてのアプリケーションロジックもUTCで行われます。HTMLで日付を出力するときは、phpのdate()のラッパー関数を使用して、ユーザーのタイムゾーンで日付を出力します。

function getTimezoneOffset($time, $timezone)
{       
    $t = new DateTime(date('Y-m-d H:i:s', $time));  
    $tz = new DateTimeZone($timezone);  
    $t->setTimeZone($tz);   
    return $t->getOffset();
}
function myDate($timezone, $format, $timestamp=false)
{
    if (!$timestamp) $timestamp = time();
    return date($format, $timestamp+getTimezoneOffset($timestamp, $timezone));
}

同様に、フォームを介してユーザーから入力を受け取る場合は、最初にタイムゾーン変換を実行して、アプリケーションでUTC日​​時を使用できるようにします。

もう1つのオプションは、PostgreSQLを使用することです。MySQLとは異なり、日時のタイムゾーンサポートが組み込まれています。

于 2009-11-06T20:33:36.127 に答える
0

標準的な方法は、表示する日付/時刻を UTC (つまり GMT) で保存し、javascript を使用してユーザーのクライアントからタイムゾーンを自動的に取得するか、ユーザーに住んでいる場所を尋ねることです。

個人的には、多くのユーザーが正しいタイムゾーンを設定していないため、自動方式は推奨しません。しかし、彼らにデフォルトを提案することは役に立ちます。

いずれにせよ、ユーザーのタイムゾーンを取得したら、それを表示する前にデータベースの UTC に保存されているタイムスタンプに追加するだけです。

于 2009-02-22T06:51:48.613 に答える