2013-04-01 8 views
3

Я создал простой помощник часового пояса для моего приложения CakePHP, используя различные примеры здесь, в Stack Overflow, который сохраняет зону пользователей против их пользовательской записи. например Европа/Лондон.Помощник часового пояса для CakePHP

Чтобы увидеть помощник: http://pastebin.com/VGivwqHJ

Когда пользователь входит в приложение, я сохранить дату/время, когда они вошли в системе, так что я могу отобразить список журналов для пользователя по соображениям безопасности. например $ this-> User-> saveField ('lastlogin', date ('Y-m-d H: i: s'));

Однако эта дата в настоящее время выведет дату/время сервера. Как я могу использовать часовой пояс пользователя для его изменения?

Я пробовал:

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

, а затем: $this->User->saveField('lastlogin', $date->date);, но я просто получить нулевой ...

Но если я отлаживать $ дату я, например:

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

1.) Что я делаю неправильно? Как вытащить дату-время из объекта?

2.) Это хороший способ справиться с этим? Поскольку это означает, что я должен заменить все вызовы date() с этим фрагментом, чтобы получить время для пользователей.

3.) Не будут ли несоответствия даты на веб-сайте, например, если пользователь в Европе сообщает что-то ПОСЛЕ пользователя в США, но поскольку использовалось их местное время, оно будет отображать его как отличающееся, возможно, выглядите так, как прежде, чем США.

Должен ли я вместо этого использовать время сервера, а затем использовать фрагмент выше, чтобы отобразить его по-разному для пользователя, поэтому все времена являются одним и тем же часовым поясом, но затем отображаются относительно пользователя?

ответ

2

Я не уверен, что вы можете сэкономить DateTime объект с saveField(). Вы должны, вероятно, преобразовать его в строку в формате, который CakePHP считает, быть универсальным:

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

Ваш исходный код, вероятно, вызывая это уведомление:

Notice: Undefined property: DateTime::$date 

... потому что нет date публичной собственности в класс DateTime.

О других вопросах, как вы уже указываете, вы, очевидно, не можете сравнивать местные времена, относящиеся к разным часовым поясам, так же, как вы не можете сравнивать километры с милями. Если вы храните местное время, вам необходимо также сохранить часовой пояс и делать конверсию каждый раз. Таким образом, проще просто нормализовать даты и всегда хранить их в одном и том же часовом поясе (время UTC или часовой пояс сервера) и выполнять преобразование при отображении информации. Это также имеет больше смысла, потому что местное время автора сообщения не имеет значения для всех остальных.

+0

Прохладный, который исправляет первый выпуск. Любые идеи по следующим двум вопросам? – Cameron

+0

@Cameron - Смотрите мое редактирование. –

Смежные вопросы