Я пытаюсь добавить дату и время для проверки записей. Я использую datetime datatype в таблице.
`date_added` datetime DEFAULT '0000-00-00 00:00:00',
Я использую следующую встроенную функцию php, используя для столбца datetime в запросе
date("Ymd H:i:s");
Проблема в том, что date("Ymd H:i:s");
этой функции date("Ymd H:i:s");
давая мне две разные даты и времени, когда я проверяю в то же время на сервере.
date("Ymd H:i:s"); == 2016-07-12 13:10:04
date("Ymd H:i:s"); == 2016-07-12 05:08:07
Поэтому, когда я использую функцию date_added
столбце date_added
это дает мне неправильное время, я имею в виду время сервера. Например, я добавляю запись, после чего функция вернет мне Record Added 8 Hours Ago
так что это совершенно неправильно. Я хотел бы знать, как можно добавить реальное время события в базу данных, которое я могу показать с помощью функции TimeAgo()
.
Есть ли способ сделать это без изменения часового пояса сервера, потому что, если я изменю часовой пояс, тогда он будет показывать правильное время только для тех, кто находится в одном регионе, но что будет получать другие? Я думаю, что они столкнутся с такой же проблемой.
Я хотел разработать что-то вроде функции DateTime в Facebook.
Может ли кто-нибудь объяснить мне, как я могу достичь такого рода функциональности? Я хотел бы оценить. Спасибо
Вместо того, чтобы возиться с часовыми поясами, почему бы просто не сделать
ALTER TABLE `your_table` CHANGE `date_added` `date_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Это изменит ваш столбец из столбца DATE в столбец TIMESTAMP , преобразуя все даты в соответствующие метки времени UTC в этом процессе.
Когда новая строка вставлена, она будет использовать текущую временную метку в качестве значения . Временные метки всегда находятся в формате UTC, поэтому вам не нужно менять часовой пояс на своем сервере MySql и не указывать дату при вставке новой строки.
Если вы не можете или не хотите изменять свои столбцы, вы также можете просто выбрать метку времени
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Для вашего TimeAgo вы можете просто сделать
$now = new DateTime; $dateAdded = new DateTime("@$yourTimestampFromDb"); $dateAdded->setTimezone($now->getTimezone()); $timeSinceAdded = $dateAdded->diff($now);
Когда вы указываете временную метку DateTime, она всегда будет использовать UTC, независимо от установленного вами часового пояса сервера по умолчанию. Следовательно, вам нужно либо преобразовать $dateAdded
в часовой пояс по умолчанию (как показано выше), либо конвертировать $timeSinceAdded
в UTC.
Чтобы изменить dateTime на часовой пояс текущего пользователя, вы либо
В любом случае вы просто меняете оба параметра DateTimes на этот часовой пояс. Это легко сделать с помощью setTimezone()
.
$timeSinceAdded
будет тогда объектом DateInterval
, который вы можете использовать следующим образом
echo $timeSinceAdded->format('%a total days');
Пожалуйста, обратитесь к ссылкам для получения дополнительной информации, например, о доступных модификаторах формата.
Если вы обращаетесь к одному серверу базы данных с клиентами с разными настройками часового пояса, вы также можете вставить и проверить поля даты / времени в sql:
INSERT INTO my_table SET date_added = NOW();
а затем также проверить с чем-то вроде
SELECT * FROM my_table WHERE TIMESTAMPDIFF(SECOND, date_added, NOW()) > 3600;
для выбора строк старше 1 часа.
Ваш вопрос немного неоднозначен, но я попытаюсь объяснить обходное решение, которое, я думаю, должно исправить эти проблемы. Если вы разрешаете другим пользователям добавлять или обновлять вашу базу данных, тогда вы должны иметь некоторую информацию о них, например, какой город / континент они приходят. У вас также могут быть телефонные контакты и многое другое. Если это правда, что вы обладаете такой информацией о своих пользователях в своей базе данных, используйте эту информацию для обнаружения и загрузки своего часового пояса при входе в систему. У вас может быть таблица со всеми часовыми поясами или создать массив, в котором будут храниться все известные часовые пояса, чтобы при вызове
date_default_timezone_set ( 'континент / город')
вы можете динамически изменять параметры в соответствии с текущим часовым поясом пользователей, а затем использовать это, чтобы повлиять на поле с добавлением даты.
Всегда установлен часовой пояс по умолчанию (UTC), поэтому без беспокойства вы можете изменить его на свой часовой пояс. Например:
date_default_timezone_set('America/New_York');
История начинается здесь. Если в вашей базе данных есть поле datetime
, которое хранится в часовом поясе Asia/Tehran
тогда у вас должен быть другой идентификатор, который подтверждает его позже, например другое поле с именем time_zone
:
// `$row->time_zone` is equal to `Asia/Tehran` $datetime = new \DateTime($row->date_added, new \DateTimeZone($row->time_zone)); $interval = (new \DateTime())->diff($datetime); echo $interval->format('Record Added %H Hour(s) Ago');
Таким образом, вы имеете разницу во времени в разных системных часовых поясах.
Функция TimeAgo / nicetime использует strtotime()
для преобразования значения поля datetime
в временную метку unix . Вы получаете несколько секунд с 1 января 1970 года 00:00:00 по UTC до даты, когда вы передали строку. Тогда функция time()
возвращает количество секунд до сих пор , а nicetime
сравнивает разницу. Проблема в strtotime
, когда мы отправляем ей текст типа «2016-07-12 05:08:07», он не знает, какой часовой пояс находится и как он должен быть преобразован в UTC, поэтому он использует лучше всего догадываться, часто неверно.
Укажите часовой пояс вашей даты, который вы передадите в nicetime()
. Вместо этого:
$date = '2016-07-04 17:45'; // get from database print nicedate($date);
попробуй это:
$date = '2016-07-04 17:45'; print nicedate($date . ' America/Denver'); // mind the gap --------^
Это должно исправить это.
Перед тем, как идти вперёд и начать сравнивать время или выполнять расчеты даты и времени по значениям, полученным из базы данных, важно понять настройки конфигурации отдельной базы данных, чтобы наши расчеты были правильными.
Следует отметить, что значением по умолчанию для переменной часового пояса MySQL является SYSTEM при запуске MySQL. Значение SYSTEM получается из переменной среды GLOBAL time_zone операционной системы.
Переменная времени часового пояса MySQL может быть инициализирована до другого значения при запуске, предоставив следующую опцию командной строки:
--default-time-zone=timezone
В качестве альтернативы, если вы задаете значение в файле опций, вы должны использовать следующий синтаксис для установки переменной:
--default-time-zone='timezone'
Если вы являетесь пользователем SUPER MySQL, вы можете установить переменную SYSTEM_time_zone во время выполнения из приглашения MYSQL>, используя следующий синтаксис:
SET GLOBAL time_zone=timezone;
MySQL также поддерживает индивидуальные значения часовых поясов SESSION, которые по умолчанию соответствуют значению переменной среды GLOBAL time_zone. Чтобы изменить значение временной зоны сеанса во время сеанса, используйте следующий синтаксис:
SET time_zone=timezone;
Чтобы опросить существующие значения настроек часового пояса MYSQL, вы можете выполнить следующий SQL для получения этих значений:
SELECT @@global.time_zone, @@session.time_zone;
Следует также отметить, что:
Текущая настройка часового пояса сеанса влияет на отображение и сохранение значений времени, чувствительных к зоне. Сюда входят значения, отображаемые такими функциями, как NOW () или CURTIME (), и значения, хранящиеся в столбцах TIMESTAMP и извлеченные из них. Значения для столбцов TIMESTAMP преобразуются из текущего часового пояса в UTC для хранения и от UTC к текущему часовому поясу клиента для извлечения.
Чтобы получить значения в UTC, используйте вместо этого UTC_DATE (), UTC_TIME () или UTC_TIMESTAMP (). Чтобы преобразовать в другой часовой пояс, передайте значение соответствующей функции UTC return в convert_tz (), для чего необходимо создать таблицы zoneinfo (см. Ниже).
В ваших обстоятельствах, если вы НЕ хотите / НЕ МОЖЕТЕ изменить значение SERVER time_zone , вам нужно будет явно установить индивидуальные значения часовых поясов SESSION для каждого клиентского соединения, что позволит вам нарисовать линию на песке и иметь известную базу из которого вы можете конвертировать и отображать время пользователя пользователя facebook в локальный часовой пояс зрителя.
Чтобы явно установить часовой пояс сеанса при подключении, выполните следующую команду:
SET SESSION time_zone = '+10:00';
Когда вы явно устанавливаете SESSION time_zone и сохраняете значение TIMESTAMP, сервер преобразует его из часового пояса клиента в UTC и сохраняет значение UTC (внутри сервера хранится значение TIMESTAMP). Когда вы выбираете данные из базы данных, происходит обратное преобразование и предоставляет клиенту время UTC в часовом поясе клиента.
Что касается типов данных и часовых поясов, то в PHP вам лучше использовать класс DatTimeZone, если вы хотите повысить точность ваших значений даты и времени, облегчая даты и время для летнего времени.
Как отмечалось ранее, если ваша база данных – это MySQL, вы можете загрузить / сгенерировать таблицы zoneinfo с помощью следующей команды:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql * where root is the username to be substituted.
Выполнение генерации таблиц zoneinfo позволяет использовать функцию convert_tz (), которая точно преобразует даты и время из одного часового пояса в другой, например:
select DATE_FORMAT(convert_tz(now(), 'UTC', 'Australia/Perth'), '%e/%c/%Y %H:%i') AS PERTH_TIME; PERTH_TIME; +-----------------+ | PERTH_TIME | +-----------------+ | 19/7/2016 19:42 | +-----------------+
Кроме того, вы можете создавать массив часовых поясов UTC программно, вызывая статические функции listIdentifiers () в классе PHP DateTimeZone.
Да прибудет с тобой сила.