Windows. Вирусы. Ноутбуки. Интернет. Office. Утилиты. Драйверы

Иногда возникает такая ситуация, что текущее время на сервере не соответствует вашему текущему часовому поясу или часовому поясу региона, на который ориентирован ваш сайт.

Чтобы было понятно, напомню: территориально Россия очень большая, и далеко не всем нужно, чтобы их сайты «жили» по московскому времени. Например, Урал, Сибирь, Дальний восток и т.д.

Серверы большинства популярных российских хостинг-провайдеров размещены на технологических площадках Москвы и Санкт-Петербурга и по-умолочанию настроены, естественно, на московскую временну́ю зону. Сервер не может автоматически подстраиваться под ваше текущее местоположение и переводить системные часы. В связи с чем, работа функций даты и времени на сайте может быть не совсем корректной. Естественно, сейчас речь не идёт о 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());

date_default_timezone_set utc (6)

new PDO("mysql:host=localhost;dbname=nametable", "username", "password", );

Эти даты необходимо сравнить в 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 .

    пояса автоматическое (6)

    Мне нужно знать, в какой часовом поясе находятся мои пользователи, на основе их IP или HTTP-заголовка.

    Я получил много ответов на этот вопрос, но я не мог понять ответ. Некоторые говорят, что использование -new Date().getTimezoneOffset()/60 (). Но что это значит?

    У меня есть date_default_timezone_set("Asia/Calcutta"); в корне моей страницы (index.php). Поэтому для этого я должен динамически установить часовой пояс и установить его вместо Asia/Calcutta .

    Answers

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

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

    Существуют некоторые стратегии, которые вы можете использовать, чтобы попытаться определить часовой пояс, например, используя библиотеку jsTimeZoneDetect , которая является отличной отправной точкой, но недостаточно несовершенна, что вы не можете просто полагаться только на нее. Если вы используете moment.js, в момент-времени есть встроенная функция, называемая moment.tz.guess() которая делает то же самое.

    Идея использования функции getTimezoneOffset() JavaScript ошибочна в том, что вы не получаете часовой пояс - только одно смещение для определенной даты. См. Раздел wiki темы тегов TimeZone под названием «TimeZone! = Offset».

    Однако вы смотрите на это, в конечном счете, вам нужно решить один из двух подходов:

    • Попросите пользователя рассказать вам о своем часовом поясе, из какого-либо раскрывающегося списка или управления тайм-зонами на основе карт .
    • Отправляйте время только браузеру в UTC и используйте JavaScript в браузере для преобразования в любой локальный часовой пояс, к которому пользователь может установить свой компьютер.

    Я обсуждаю это более подробно (с точки зрения AC #) в этом ответе.

    Часовой пояс недоступен в заголовке HTTP, но страна (аббревиатура) находится в заголовке ACCEPT_LANGUAGE. Это будет нечто вроде «en-US» (США - код страны). Это можно комбинировать с информацией JavaScript, чтобы получить представление о часовом поясе пользователя.

    Это то, что я использую в JS:

    Function timezone() { var now = new Date(); var jano = new Date(now.getFullYear(), 0, 1).getTimezoneOffset()/-60; var julo = new Date(now.getFullYear(), 6, 1).getTimezoneOffset()/-60; var tz = Math.min(jano, julo); if (jano != julo) tz += ((jano < julo) ? "S" : "W") + Math.abs(jano - julo); return tz; }

    Это возвращает строку типа «-6S1» для центральной зоны (стандартное смещение по времени на -6 часов, летнее время действует летом и добавляет 1 час). Я использую cookie, чтобы сделать это доступным для PHP. PHP ищет базу данных TZ для зон, которые соответствуют этому, и страны. Для здесь (US, -6S1) существует 7 соответствующих зон, первая - «Америка / Чикаго».

    Кстати, в базе данных есть две зоны, где DST добавляет что-то, кроме 1 часа: лорд-Хоу-Айленд (10.5W0.5) и Тролль-станция, Антарктида (0W2).

    Одно из них - спросить их! Особенно в тех системах членов, где вы можете захватить / зарегистрировать пользователя - дать им выбор в этот момент. Простой, но точный.

    Это прекрасно работает...

    Echo

    Примерно так и работает вывод времени с учётом часового пояса пользователя на PHP . Безусловно, можно и не ставить по умолчанию время по Гринвичу, а узнавать смещение относительно серверного времени. Впрочем, о смещении мы с Вами поговорим в следующей статье.


    Это небольшая статья о том, как работать с временными зонами при хранении значений даты / времени в базе данных. Базы данных или язык программирования, который вы решите использовать, решающего значения не имеет, так как описываемые в статье явления универсальны. Свои действия я буду показывать на примере использования связки 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.

    Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
    ПОДЕЛИТЬСЯ: