0

MySql で Propel 1.6 を使用しています。次のように、すべてのテーブルでタイムスタンプ可能な動作を設定しました。

<database name="default" >
    <behavior name="timestampable">
        <parameter name="create_column" value="creation_date" />
        <parameter name="update_column" value="last_modified" />
    </behavior>

    <table name="book" phpName="Book">
        <!-- table colums omitted -->
    </table>
</database>

Propel のタイムスタンプ可能な動作のドキュメントによると、タイムゾーンを指定するパラメーターはありません。

タイムスタンプ可能な動作では、デフォルトで UTC 時刻が設定されていないことに気付きました。たとえば、私の場合、UTC + 1 を設定します。

少し調べてみると、preInsert()フックを使用して動作の代わりに時間を設定し、Unix タイムスタンプを渡すと次のようになります。

public function preInsert(PropelPDO $con = null)
{
    $this->setCreationDate(time());
    return true;
}

結果の時間はまだ UTC+1 です。DateTimeUnix タイムスタンプの代わりにオブジェクトを使用して時刻を設定した場合:

public function preInsert(PropelPDO $con = null)
{
    $this->setCreationDate(new DateTime('now', new DateTimeZone('UTC')));
    return true;
}

データベースで正しい UTC 時刻を取得します。

コードをチェックインしたところ、バハビアが Unix タイムスタンプを通過する時刻を設定しているため、データベースで UTC+1 が発生することがわかりました。

私の質問は次のとおりです。

  1. Propel のタイムスタンプ可能な動作を UTC で設定することは可能ですか?
  2. そうでない場合、Propel はどこで日付形式/タイムゾーンを設定しますか? フックを使用し、タイム ゾーンを指定しpreてオブジェクトを渡すことDateTimeは、データベースで UTC 時刻を取得する唯一の方法ですか (カスタム動作を実装する以外に)?
  3. また、Propel のタイムスタンプ可能な動作のタイムゾーンを設定できない場合、そもそもその全体的な目的は何ですか? (データベースに UTC タイムスタンプを設定するのはかなり一般的な方法です)
4

2 に答える 2

0

この質問とそのphpドキュメントにtime()time()よると、Unixエポックからの秒数を返すことになっていることは明らかです。これは常にUTCになります。実際、これはPropelとタイムスタンプ可能な動作を使用するすべてのプロジェクトに当てはまります。プロジェクトがそうしていない場合は、より深刻な問題が発生している可能性があります(つまり、Propelの問題ではありません)。そうは言っても、あなたの質問に対する私の答えは次のとおりです。

  1. 動作はtime()、PHPドキュメントに従って常にUTCであるを使用します。
  2. (1)を参照してください。いいえ、Propelにはそのようなタイムゾーン設定はありません(PHPtime()にはありますが、ではなく、に使用されmktime()ます)。preInsert()あなたがそれをしなければならないなら、あなたのフックは回避策としてうまく働くはずだと思います。
  3. (1)を参照してください。タイムスタンプ可能な動作は非常に単純で、を使用するtime()だけですが、いつでも独自に作成できます。実際、既存の動作ファイルをコピーして、ビルドプロパティに追加するだけです(カスタム動作のPropelドキュメント)。

幸運を!

于 2013-01-16T16:18:53.660 に答える
0

ドキュメントにはタイムゾーンについて特に言及されていませんが、次のように設定できるはずです...

$objSourceTimezone = new DateTimeZone('America/Los_Angeles');
$objDestinationTimezone = new DateTimeZone('UTC');

$objTime = new DateTime([some date], $objSourceTimezone);
$objTime->setTimeZone($objDestinationTimezone);

$objPropel->setTimestamp($time->format('Y-m-d H:i:s'));

私はローカルの太平洋タイムゾーンを使用しており (ただし、好きなものを使用できます)、MySQL および Propel のTIMESTAMP列と互換性のある UTC 形式に変換しています。

このデータを取得し、反対のことを行うことで別のタイムゾーンで表示できます...

$objSourceTimezone = new DateTimeZone('UTC');
$objDestinationTimezone = new DateTimeZone('America/New_York');

$objTime = new DateTime($objPropel->getTimestamp(), $objSourceTimezone);
$objTime->setTimeZone($objDestinationTimezone);

print $time->format('Y-m-d H:i:s').”\n”;
于 2013-01-16T15:35:13.627 に答える