date_default_timezone_set utc (6)
new PDO("mysql:host=localhost;dbname=nametable", "username", "password", );
php $finalize_at = date ("Y-m-d H:i:s" ); ?>Эти даты необходимо сравнить в MySQL с помощью функции NOW() чтобы вернуть разницу в часах, например:
SELECT TIMESTAMPDIFF ( hour , NOW (), finalize_at ) FROM plans ;Но проблема в том, что дата даты функции PHP date("Ymd H:i:s") использует настройку часового пояса PHP, а функция NOW() занимает время MySQL с сервера MySQL.
Я пытаюсь решить это:
- date_default_timezone_set("Europe/Paris"); Он работает только для PHP.
- date.timezone= "Europe/Paris"; Он работает только для PHP.
- SELECT CONVERT_TZ(now(), "GMT", "MET"); Это возвращает пустое.
- mysql> SET time_zone = "Europe/Paris"; Это выдает ошибку из консоли MySQL.
И часовой пояс для MySQL не меняется.
Есть ли способ изменить часовой пояс для PHP и MySQL без необходимости делать это с консоли MySQL или установить изменение часового пояса где-то в php.ini и сделать эти значения доступными как для PHP, так и для MySQL.
Очень ценю вашу поддержку.
Вы можете сделать это легко только двумя строками PHP.
$tz = (new DateTime ("now" , new DateTimeZone ("Asia/Kabul" )))-> format ("P" ); $pdo -> exec ("SET time_zone="$tz";" );Для PHP используйте эту функцию:
date_default_timezone_set () default - time - zone = "timezone"Если у вас есть привилегия root , вы можете установить значение глобального часового сервера во время выполнения с помощью этого оператора:
SET GLOBAL time_zone = timezone ;Часовой пояс за соединение. Каждый клиент, который подключается, имеет свой собственный часовой пояс, заданный time_zone variable . Первоначально переменная сеанса принимает свое значение из global time_zone переменной global time_zone , но клиент может изменить свой собственный часовой пояс с помощью этого оператора:
SET time_zone = timezone ;Лучший метод Установите часовой пояс в PDO MySQL:
При необходимости, по ошибке вы можете использовать: date ("P") Пример:
new PDO ("mysql:host=localhost;dbname=nametable" , "username" , "password" , [ PDO :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;SET time_zone = "" . date ("P" ). """ ]);Я могу изменить свой часовой пояс mysql по умолчанию из раздела переменных, отредактировав строку, которая говорит «часовой пояс» в phpmyadmin.
Здесь вы также можете изменить формат и многое другое, которое вы можете найти в поддержке mysql http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html , я надеюсь, что он вам поможет.
$unsafe_variable = (is_numeric($_POST["user_input"]) ? $_POST["user_input"] : "");
И гораздо лучше использовать эти функции для проверки входных данных mysql_real_escape_string .
21 марта 2013 в 12:58Dater - определяет часовой пояс, локализует и форматирует время в PHP
- PHP
Когда при разработке веб-проекта встаёт задача учёта часовых поясов пользователей, то каждый раз решение как будто приходится изобретать заново. Из множества известных мне проектов решивших эту задачу я не припомню ни одного решения, которое можно было бы назвать простым, прозрачным для всей архитектуры и универсальным.
А что если хочется просто несколько строчек кода, и чтобы весь остальной код никогда не узнал, что данные клиенту нужно отдавать в другом часовом поясе, и что в данных пришедших от клиента время может быть указано с часовым поясом отличным от серверного? Для решения этой и многих других задач, сегодня я расскажу вам про одну лаконичную и функциональную библиотеку для PHP.
И так, встречайте - Dater , и его основные возможности:
- Биндинг форматов
- Локализация текстов и форматов
- Расширение списка опций форматирования
- Автоопределение часового пояса
- Конвертация времени с учётом часового пояса
- Автоматическая конвертация времени в $_GET, $_POST, $_REQUEST с учётом часового пояса
- Автоматическая конвертация часового пояса в шаблоне отправляемых данных
Биндинг форматов
Позволяет стандартизовать для проекта набор используемых форматов и работать с ними по имени:$dater = new Dater\Dater(new Dater\Locale\En()); $dater->format(time(), "d/m/Y"); // 2013/03/14 $dater->addFormat("slashedDate", "d/m/Y"); $dater->format(time(), "slashedDate"); // 2013/03/14 $dater->slashedDate(time()); // 2013/03/14
Расширение опций форматирования
Доступны все опции форматирования из date() , которые также могут быть переопределены и расширены:$dater->addFormatOption("ago", function (DateTime $datetime) { return floor((time() - $datetime->getTimestamp()) / 86400) . " days ago"; }); $dater->format(time() - 60*60*24*7, "d F Y, ago"); // 14 March 2013, 7 days ago
Поддержка локалей
$dater->setLocale(new Dater\Locale\En()); echo $dater->date(); // 03/21/2013 echo $dater->now("j F Y"); // 21 March 2013 $dater->setLocale(Dater\Dater::getLocaleByCode("ru")); echo $dater->date(); // 21.03.2013 echo $dater->now("j F Y"); // 21 марта 2013Стандартные методы для серверных и пользовательских форматов с учётом локали
echo $dater->date(); // 03/21/2013 (client timezone, depends on locale) echo $dater->time(); // 5:41 AM (client timezone, depends on locale) echo $dater->datetime(); // 03/21/2013 5:41 (client timezone, depends on locale) echo $dater->isoDate(); // 2013-03-21 (client timezone) echo $dater->isoTime(); // 05:41:28 (client timezone) echo $dater->isoDatetime(); // 2013-03-21 05:41:28 (client timezone) echo $dater->serverDate(); // 2013-03-21 (server timezone) echo $dater->serverTime(); // 09:41:28 (server timezone) echo $dater->serverDatetime(); // 2013-03-21 09:41:28 (server timezone)Конвертация даты-времени с учётом часового пояса
$dater->setServerTimezone("Europe/Moscow"); $dater->setClientTimezone("Europe/London"); echo $dater->serverDatetime(); // 2013-03-21 08:18:06 echo $dater->isoDatetime(); // 2013-03-21 04:18:06 echo $dater->time(); // 04:18Стоит упомянуть, что при вызове $dater->setServerTimezone("Europe/Moscow"); функция date() и класс DateTime будут возвращать время в новом установленном часовом поясе. Чтобы это отключить передайте методу false вторым параметром.
И наконец обещанное
Код, который позволит вам автоматически определить часовой пояс клиента и выводить для него актуальную дату-время:В заголовке глобального скрипта инициализации
$dater = new Dater\Dater(new Dater\Locale\Ru(), "Europe/Moscow");
$timezoneDetector = new Dater\TimezoneDetector();
$dater->setClientTimezone($timezoneDetector->getClientTimezone());
$dataHandler = new Dater\DataHandler($dater);
$dataHandler->enableOutputTimezoneHandler();
$dataHandler->convertRequestDataToServerTimezone();
В основном шаблоне
= $timezoneDetector->getHtmlJsCode() ?>
Теперь все строки YYYY-MM-DD HH:MM:SS в отправляемых данных будут заменены на YYYY-MM-DD HH:MM:SS в автоматически определённом часовом поясе клиента. Если же вам нужно выводить дату-время в определённом формате, то достаточно добавить YYYY-MM-DD HH:MM:SS[Н m d] или YYYY-MM-DD HH:MM:SS где date - забинденный в Dater формат. Также можно выводить и форматировать timestamp формат: 1363853607.
Например, следующие данные
Timestamp format: 1363238564 (не изменится) Timestamp format: 1363238564 Timestamp format: 1363238564 Server datetime format: 2013-03-14 09:22:44 Server datetime format: 2013-03-14 09:22:44 Server datetime format: 2013-03-14 09:22:44
Будут автоматически конвертированы в
Timestamp format: 1363238564 (не изменится) Timestamp format: 2013/03/14 Timestamp format: 14.03.2013 07:22 Server datetime format: 2013/03/14 Server datetime format: 07:22 Server datetime format: 2013-03-14 07:22:44
В то же время $dataHandler->convertRequestDataToServerTimezone(); сделает так, что все YYYY-MM-DD HH:MM:SS данные поступающие от клиента будут конвертированы в YYYY-MM-DD HH:MM:SS часового пояса сервера. Таким образом сервер никогда не узнает о том, что клиент получает и отправляет дату-время в другом часовом поясе.
Стоит признать, что это немножко экстремальный вариант обработки часовых поясов. Более универсальным и традиционным решением было бы отказаться от использования $dataHandler->enableOutputTimezoneHandler(); и просто обрамлять вставку каждой даты-времени вызовом соответствующего метода форматирования. Например = $dater->date($datetimeOrTimestamp) ?> .
О проекте
Честно признаюсь, что являюсь автором этой библиотеки, и буду очень благодарен за любую критику и помощь в доработке. Исходники выложены наЭто небольшая статья о том, как работать с временными зонами при хранении значений даты / времени в базе данных. Базы данных или язык программирования, который вы решите использовать, решающего значения не имеет, так как описываемые в статье явления универсальны. Свои действия я буду показывать на примере использования связки MySQL и PHP. Проблема, связанная с временными зонами, достаточно банальна. Многие часто забывают об их существовании, а некоторые считают их чем-то чрезмерно сложным. Обычно при настройке базы данных или при пользовании услугами веб-хостинга ваши временные зоны настроены по умолчанию. Настройки по умолчанию подойдут, если вы работаете с одним сервером, но что произойдет, если вы решите переместить его?
Тот же вопрос закономерен, если у вас несколько серверов в разных местах.
Вместо того чтобы хранить временные зоны с указанием каждой даты, лучше взять за основу стандартное время и связать все ваши даты с ним. Такой способ позволяет сделать переход на стандартное время до того, как значение будет сохранено в базе данных. Вообще, хорошая идея - просто использовать UTC +00:00
.
Что такое UTC
Формат UTC расшифровывается как «Всемирно координированное время» и является преемником «Среднего времени по Гринвичу» (GMT). Эти два формата практически идентичны, но UTC считается принятым стандартом. В общем, UTC основывается на выделении 40 различных временных зон. За точку отсчета в UTC принято брать 00:00 часов. Итого получается 12 основных временных зон, как с положительным, так и с отрицательным значением, а также некоторые дополнительные временные зоны, вроде получасовых UTC +04:30 . Идея состоит в том, что если у вас есть временная зона UTC -05: 00 , то вам придется вычесть 5 часов от начального UTC +00:00 , чтобы добиться нужного соответствия. То есть, если это 14:00 (или 2 часа вечера) а ваша временная зона UTC-05: 00 (EST или Восточный часовой пояс), то UTC +00:00 будет равен 19:00 (или 7 часам вечера).- Графическое представление мировых временных зон (Wikipedia)
- Список сокращений временных зон (Wikipedia)
Хранение времени в формате UTC +00:00
Первое, что мы должны сделать, - определиться, какую временную зону использовать для хранения всех наших значений. Я настоятельно рекомендую взять за основу UTC +00:00 - без особой причины, кроме как той, что ее легко запомнить и 0 представляет собой идеальную точку отсчета. Так как мы знаем, что все даты указаны в UTC +00:00 , становится гораздо легче представлять надлежащее время для каждого пользователя на основе их личных временных зон. После того как пользователь выбрал (или у нас есть автоопределение) свой часовой пояс, вывод соответствующего времени для этого пользователя становится обычным делом.Установка временной зоны по умолчанию
Полагая, что все наши даты / время хранятся в формате UTC, мы можем просто установить по умолчанию временную зону, которая будет использоваться для отображения каждого времени. Это позволит автоматически подобрать дату и время для конкретного пользователя. В PHP все, что нам нужно сделать, - это установить временную зону, например, так:date_default_timezone_set("EST");
Мы можем сделать это в каком-нибудь блоке инициализации в начале нашего кода - и все готово: все даты будут отображаться надлежащим образом для того часового пояса, в котором находится пользователь.
Если мы хотим получить полный контроль над датой и временем, мы можем построить функцию следующим образом:
function get_date($date)
{
date_default_timezone_set("EST");
$date = date("Y-m-d H:i:s", strtotime($date));
date_default_timezone_set("UTC");
return $date;
}
Настройка PHP под UTC +00:00
Конечно, все было бы не так просто, если бы мы не настроили нашу систему под UTC, как временную зону по умолчанию. Я уверен, что это может быть сделано примерно одинаково и в других языках, но PHP это делается следующим образом:date.timezone = UTC
Теперь всякий раз, когда мы используем такие вещи, как, например, функцию time() , это автоматически дает нам время в формате UTC с соответствующим смещением на основе нашего серверного времени. Если мы захотим настроить даты, в такой базе данных как MySQL, сделаем так:
date("Y-m-d H:i:s", time());
Если у нас не было доступа к изменению конфигурации PHP, то мы должны настроить время вручную при установке даты, вот так:
date("Y-m-d H:i:s", time() - date("Z"));
Настройка MySQL под UTC +00:00
Непосредственная установка даты, как мы делали выше, применима, если у нас нет доступа к изменению параметров конфигурации MySQL. Тем не менее, если мы хотим использовать TIMESTAMP , которая обычно самообновляется, или такую функцию даты из MySQL, как NOW() , то мы должны настроить MySQL для использования UTC в качестве временной зоны по умолчанию.В MySQL это делается путем установки UTC смещения, которое может быть сделано так же легко, как это было в PHP, путем внесения следующих изменений:
default-time-zone = "+00:00"
Обновление существующих дат / времени
Если вы решили стандартизировать временные зоны при помощи UTC, где временной зоной по умолчанию является UTC +00:00 смещение, то теперь ваш текущее время в вашей базе данных будет неработоспособно.К счастью, MySQL предоставляет удобную функцию, которая дает нам возможность легко обновлять существующие часовые пояса.
ПРИМЕЧАНИЕ: Если у вас есть какие-нибудь временные метки, то их нужно обновить в первую очередь.
Мы можем осуществлять поиск по всем полям даты и времени в нашей базе с помощью следующего запроса:
SELECT *
FROM `information_schema`.`COLUMNS`
WHERE
`TABLE_SCHEMA`="table_name" AND
(`DATA_TYPE`="timestamp" OR `DATA_TYPE`="datetime" OR `DATA_TYPE`="date");
Отсюда мы можем использовать следующий запрос, чтобы обновить даты / время в наших таблицах:
UPDATE `table_name` SET `timestamp`=CONVERT_TZ(`timestamp`, "-05:00", "+00:00");
Где -05:00
- текущая временная зона, в формате которой хранится время (она как и в предыдущем случае относится к Восточной). Временная зона +00:00
, в которую мы хотим преобразовать, в данном случае относится к UTC.
Иногда возникает такая ситуация, что текущее время на сервере не соответствует вашему текущему часовому поясу или часовому поясу региона, на который ориентирован ваш сайт.
Чтобы было понятно, напомню: территориально Россия очень большая, и далеко не всем нужно, чтобы их сайты «жили» по московскому времени. Например, Урал, Сибирь, Дальний восток и т.д.
Серверы большинства популярных российских хостинг-провайдеров размещены на технологических площадках Москвы и Санкт-Петербурга и по-умолочанию настроены, естественно, на московскую временну́ю зону. Сервер не может автоматически подстраиваться под ваше текущее местоположение и переводить системные часы. В связи с чем, работа функций даты и времени на сайте может быть не совсем корректной. Естественно, сейчас речь не идёт о CMS, в которых поправка часового пояса обычно присутствует прямо в интерфейсе администратора.
В первую очередь проверьте текущее состояние с помощью PHP-кода:
echo ini_get("date.timezone");Хорошо, если у вас свой сервер и имеется доступ к php.ini, где можно задать нужную временну́ю зону и забыть. Например, таким образом:
Date.timezone = Europe/Moscow
Правда, если на сервере размещены несколько проектов, в которых должны поддерживаться различные часовые пояса, тогда лучше этого не делать. В этом случае будет правильнее задать временные зоны только для проектов, где один часовой пояс.
Установка временной зоны на виртуальном хостинге
На виртуальном хостинге, доступа к конфигам сервера чаще всего нет. Поэтому, в первую очередь попробуйте задать временну́ю зону с помощью .htaccess . Просто найдите или создайте в корне своего сайта файл.htaccess и добавьте в него такую строку:
Php_value date.timezone "Europe/Moscow"
Если способ не сработает, тогда воспользуемся функцией date_default_timezone_set() , которая устанавливает временную зону по-умолчанию для всех функций даты и времени. Для этого нужно где-нибудь в начале скрипта просто добавьте такую строку:
Date_default_timezone_set("Europe/Moscow");
Естественно, Europe/Moscow меняется на необходимый вам часовой пояс. Для территории РФ в PHP поддерживаются следующие временные зоны:
- Europe/Moscow
- Europe/Samara
- Europe/Kaliningrad
- Europe/Volgograd
- Asia/Anadyr
- Asia/Kamchatka
- Asia/Krasnoyarsk
- Asia/Magadan
- Asia/Novokuznetsk
- Asia/Novosibirsk
- Asia/Omsk
- Asia/Sakhalin
- Asia/Vladivostok
- Asia/Yakutsk
- Asia/Yekaterinburg
Со списком всех доступных временных зон можно ознакомиться по ссылке или выполнить команду, которая возвратит вам список временных зон, доступных на вашем сервере.
Print_r(DateTimeZone::listIdentifiers());
Если вы заметили, что время на вашем сайте не совпадает с вашим часовым поясом и вы хотели бы его поправить, то для этого существует несколько способов. Большинство виртуальных хостингов запрещает редактирование этого файла, но не отчаивайтесь, достигнуть того же результата можно внеся некоторые изменения в файл.htaccess. В данном руководстве вы узнаете, как изменить часовой пояс вашего сайта.
Перед тем, как вы начнёте это руководство, вам понадобится следующее:
- Доступ к панели управления хостингом или FTP
Шаг 1 - Поиск и редактирование файла.htaccess
Файл .htaccess находится в каталоге public_html . Вы можете открыть его с помощью Файлового Менеджера в вашей панели управления хостингом или подключившись к вашей учётной записи через FTP-клиент (например, FileZilla). Данные руководства детально рассказывают об обоих способах:
Шаг 2 - Поиск правильного часового пояса
Список всех поддерживаемых часовых поясов может быть найден на этом сайте .
Во-первых, выберите свой регион.
Теперь выберите часовой пояс, который вы хотите использовать. В нашем случае, мы выберем Europe/Moscow.
Шаг 3 - Настройка часового пояса через.htaccess
После того, как вы узнаете формат вашего часового пояса, откройте файл .htaccess . После этого, добавьте следующий код в самый верх файла .htaccess :
Php_value date.timezone "Europe/Moscow"
ВАЖНО! Вместо Europe/Moscow впишите нужный вам часовой пояс.
Поздравляем, вы успешно изменили часовой пояс вашего сайта!
Заключение
Это краткое руководство рассказало вам о том, как изменить часовой пояс на сайте через.htaccess. Теперь вам не нужно беспокоиться о неправильном времени на вашем сайте.