PHP, Codeigniter: Как Назначить Дату на основе пользовательского часового пояса/местоположения глобально в веб-приложении?

Я только что понял, добавляю ли я конкретную запись на свою базу данных MySQL - она будет иметь дату/время сервера а не конкретного пользователя и где они расположены, что означает, что моя поисковая функция по дате бесполезна! Поскольку они не будут в состоянии искать тем, когда они добавили его в своем часовом поясе скорее, когда это было добавлено в часовом поясе серверов.

Есть ли путь в Codeigniter для глобальной установки времени и даты, характерного для пользовательского местоположения (возможно, использующий их IP) и каждый раз I дат вызова () или время (), что пользовательский часовой пояс используется.

То, что я на самом деле прошу, вероятно, как сделать мое зависящее от приложения на каждом пользовательском часовом поясе?

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

Спасибо все

10
задан Abs 16 February 2010 в 16:47
поделиться

6 ответов

Я думаю, что самый простой способ - определить часовой пояс для внутреннего хранилища данных (часовой пояс вашего сервера или UTC) и преобразовать время в соответствии с часовым поясом пользователя при его выводе.

Я не знаю CodeIgniter, поэтому не могу указать вам на нужные функции. Одна известная библиотека, которая знает часовые пояса, - Zend_Date: Работа с часовыми поясами Я еще не работал с этими функциями, но они выглядят многообещающими.

Однако, если вы знаете часовой пояс пользователя, нетрудно собрать собственную функцию, которая добавляет / вычитает смещение при выводе даты и / или времени.

Возможно связанный вопрос:

4
ответ дан 3 December 2019 в 23:49
поделиться

Похоже, что вам нужно сохранить все дату и время в вашей системе как время UTC (раньше называлось GMT). Это базовое время, по которому все в мире рассчитывается с поправками. (например: Центральное время составляет -6 часов от UTC)

В MySQL вы можете использовать UTC_TIMESTAMP () для получения текущего времени UTC, если ваш сервер и БД настроены с правильными настройками времени и часового пояса.

В PHP запустите это, чтобы установить метку времени PHP в UTC (вы запустите это в своем коде, поэтому поместите его на каждую страницу или в централизованный индексный файл):

date_default_timezone_set('UTC');

Или вы можете перейти непосредственно в PHP.INI и скажите ему использовать всемирное время в формате UTC. (это может не сработать, если у вас есть несколько веб-сайтов на одной установке PHP.

И затем в любом месте системы вам нужно получить текущее время в формате UTC, вы можете просто позвонить:

time();

Затем для каждого пользователя в системе вы нужно будет спросить их, в каком часовом поясе они живут, а затем, когда вы показываете время, сделайте корректировку для этого пользователя. Итак, если сейчас 17:00 по всемирному координированному времени, а я живу в Пасхе, США (-5), время будет 5:00 - 5 hours = 12:00 PM.

Это может быть долгий процесс, но как только вы это сделаете, ваши пользователи сочтут это очень полезным, особенно на международном уровне.

5
ответ дан 3 December 2019 в 23:49
поделиться

Возьмем пример существующего веб-приложения, такого как WordPress и phpBB. У каждого пользователя есть своя настройка часового пояса.

При получении контента от пользователя, используйте local_to_gmt() функцию в Date Helper, затем сохраните контент в базу данных, используя дату gmt. При извлечении данных вы получите время в gmt. Получите настройки часового пояса пользователя, затем отобразите данные в этом часовом поясе.

Таким образом, вы избавите себя от необходимости пересчитывать время между двумя часовыми поясами. Просто убедитесь, что время на вашем сервере установлено правильно, чтобы все ваши данные отображались в правильном времени gmt.

UPDATE:

Недавно я просмотрел последний проект, над которым я работал, в котором была проблема с часовыми поясами. После обдумывания различных сценариев, вот решение проблемы с часовым поясом:

  1. Все данные, хранящиеся сейчас, уже используют время сервера. Изменение этого займет много времени и чревато ошибками, поэтому я оставляю все как есть.
  2. Для новых данных от пользователя, который установил дату контента на определенную дату и время, я сохранил их в 2 столбца. Первый столбец предназначен для хранения данные как есть, и используется для отображения как есть. Второй столбец будет пересчет даты на основе часового пояса пользователя в часовой пояс сервера. часовой пояс. Этот столбец используется в операторе WHERE (фильтр на основе дата сервера) и для ORDER (потому что все значения этого столбца находятся в одном часовом поясе, который является часовым поясом сервера). часовой пояс).

Таким образом, я делаю только один расчет часового пояса, который заключается в преобразовании даты пользователя в дату сервера. Для отображения, я отображаю дату в соответствии с временем сервера. Поскольку все данные хранятся в одном часовом поясе, данные могут быть упорядочены по столбцу, который содержит значение даты сервера.

Для пользователей, которые установили свой часовой пояс, дата из базы данных может быть легко пересчитана, чтобы получить время в часовом поясе пользователя. Кстати, в моем приложении я отображаю дату с помощью timeago jquery plugins. Этому плагину нужно время в формате ISO8601 (время UTC). Для этого можно использовать функцию local_to_gmt() в CodeIgniter.

2
ответ дан 3 December 2019 в 23:49
поделиться

Я думаю, что пересчет на время пользователя - лучший вариант, поскольку он дает вам нормализованное время на сервере, т.е. если вам нужно что-то найти, что произошло (с вашей точки зрения) час назад у вас не будет проблем с американцами, азиатами и, например, австралийское время.

Просто спросите их часовой пояс (обычно выбирайте из крупных городов в этом часовом поясе), а затем пересчитайте :)

Или, в качестве альтернативы, вы можете сохранить две даты - одну для сравнения и одну для show, поэтому у вас не будет так много вычислений на сервере.

Кроме того, при пересчете можно использовать помощник по дате: http://ellislab.com/codeigniter/user-guide/helpers/date_helper.html

1
ответ дан 3 December 2019 в 23:49
поделиться

Очевидно, что переход на британское летнее время (летнее время) - большая путаница в мире программирования, и я действительно запутался в этой путанице.

Наилучшее решение, которое я могу найти (которое я попытаюсь связно объяснить) при использовании системы, чувствительной к часовому поясу, заключается в следующем:

  • Веб-сервер и база данных должны работать в одном часовом поясе компьютера. Я предлагаю UTC, поскольку это строительные блоки преобразования часовых поясов. Это обеспечит постоянство всех дат, хранящихся в вашей базе данных, и не пропустит время, такое как 1-часовой переход между переходом на летнее время.
  • В верхней части всех ваших сценариев PHP используйте date_default_timezone_set ('Europe / London'); с конкретным часовым поясом пользователя.
  • При создании дат из форм, отправленных пользователем, используйте gmmktime (); , чтобы гарантировать, что созданная временная метка - это UTC, а не изменена часовым поясом, который вы установили.
  • date (); можно использовать при отображении дат, так как это преобразует метку времени в правильное время с учетом установленного вами часового пояса.
  • Если вам действительно нужно отображать дату в формате UTC, используйте gmdate (); с $ gm_timestamp , взятым из базы данных или созданным с помощью gmmktime (); .

Я написал этот фрагмент PHP, чтобы помочь разобраться в ситуации.

date_default_timezone_set('UTC');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';

date_default_timezone_set('Europe/London');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';

Надеюсь, я проделал хорошую работу, но я сомневаюсь в этом, потому что все еще пытаюсь бороться с проблемой в своей голове.

ОБНОВЛЕНИЕ:

Рад, что сделал это, потому что теперь у меня есть сомнения по поводу введенных пользователем дат.

Чтобы дата, введенная пользователем (с учетом его часового пояса), совпадала с соответствующей датой UTC в базе данных, вы должны ввести ее через mktime () . Затем используйте gmdate ('U', $ timestamp); , чтобы получить истинную временную метку UTC. (Я думаю)

Пример

Если посмотреть на это со стороны отчетности, пользователь использует часовой пояс «Европа / Лондон». В начале нашего PHP-скрипта мы вызываем date_default_timezone_set ('Europe / London'); , в то время как база данных (и все записи в ней) по-прежнему находятся в формате UTC.

Затем пользователь отправляет сообщение о том, что он хочет выбрать список книг, добавленных в базу данных в период с 10:00 25.03.2010 по 14:00 30.03.2010. Затем сценарий PHP запускает переменные даты через mktime ($ час, $ минута, $ секунда, $ месяц, $ день, $ год) , чтобы сгенерировать правильную метку времени в формате UTC. Дата начала не изменится, но PHP знает, что дата окончания находится в часовом поясе BST, поэтому соответственно меняет метку времени на UTC.

Когда результаты возвращаются пользователю, можно использовать date ('r', $ date_added) , чтобы показать пользователю дату добавления книги в базу данных в соответствии с их установленным часовым поясом.

Эта ссылка может помочь понять, когда она меняется. http://www.daylightsavingtime.co.uk/

1
ответ дан 3 December 2019 в 23:49
поделиться

Я использовал встроенное преобразование часового пояса MySQL. В базе данных все даты хранятся в формате UTC. В запросе выбора я использовал CONVERT_TZ для преобразования в часовой пояс пользователя. Вы можете указать коды часовых поясов или инверсии часов, например:

SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');

Но проблема в том, что это не подходит для летнего времени. Это особенно расстраивает, поскольку во многих частях мира либо не соблюдается летнее время, либо оно применяется в разные даты. Итак, если вы установите таблицы описания часовых поясов , вы можете использовать описательные имена, которые будут автоматически учитывать переход на летнее время, например:

SELECT CONVERT_TZ('2004-01-01 12:00:00', 'UTC', 'US/Eastern');
0
ответ дан 3 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: