3

ユーザー レコードに対してユーザー ゾーンを保存するスタック オーバーフローのさまざまな例を使用して、CakePHP アプリ用のシンプルなタイムゾーン ヘルパーを作成しました。例: ヨーロッパ/ロンドン。

ヘルパーを表示するには: http://pastebin.com/VGivwqHJ

ユーザーがアプリケーションにログインすると、セキュリティ上の理由からユーザーにログのリストを表示できるように、ログインした日時を保存します。例: $this->User->saveField('lastlogin', date('Ymd H:i:s'));

ただし、その日付は現在サーバーの日付/時刻を取得します。ユーザーのタイムゾーンを使用して修正するにはどうすればよいですか?

私は試した:

$date = new DateTime(null, new DateTimeZone($user['User']['timezone']));

そして:$this->User->saveField('lastlogin', $date->date);しかし、私はnullになるだけです...

しかし、 $date をデバッグすると、たとえば次のようになります。

object(DateTime) {
    date => '2013-04-01 15:22:32'
    timezone_type => (int) 3
    timezone => 'Europe/London'
}

1.) 私は何を間違っていますか? オブジェクトから日時を取得するにはどうすればよいですか?

2.) これはこれを処理する良い方法ですか? つまり、ユーザーの時間を取得するには、すべてのdate()呼び出しをこのスニペットに置き換える必要があります。

3.) ウェブサイトの日付が不一致になることはありませんか。たとえば、ヨーロッパのユーザーがアメリカのユーザーの後に何かを投稿した場合、現地時間が使用されているため、異なるものとして表示され、アメリカの前のように見える可能性があります。片方。

代わりにサーバー時間を保存してから、上記のスニペットを使用してユーザーに異なる方法で表示する必要があります。そのため、すべての時間は同じタイムゾーンですが、ユーザーに対して相対的に表示されますか?

4

1 に答える 1

2

DateTimeでオブジェクトを正しく保存できるかどうかはわかりませんsaveField()。おそらく、CakePHP が普遍的であると信じている形式の文字列に変換する必要があります:

$this->User->saveField('lastlogin', $date->format('Y-m-d H:i:s'))

元のコードはおそらくこの通知をトリガーしています:

Notice: Undefined property: DateTime::$date

... DateTimeクラスdateにはパブリック プロパティがないためです。

他の質問については、すでにご指摘のとおり、キロメートルとマイルを比較できないのと同様に、異なるタイム ゾーンに属する現地時間を比較することはできません。現地時間を保存する場合は、タイム ゾーンも保存し、毎回変換する必要があります。したがって、日付を正規化し、常に同じタイム ゾーン (UTC またはサーバーのタイム ゾーン) で保存し、情報を表示するときに変換を実行する方が簡単です。投稿者の現地時間は他のすべての人にとって無関係であるため、これはより理にかなっています。

于 2013-04-01T14:47:56.983 に答える