|
Пользователь 76561 Посетитель Сообщений: 69 |
Проверка сайта Время на БД и веб сервере: Время отличается на 3600 секунд Рекомендации Попытался установить часовой пояс для базы данных в /bitrix/php_interface/after_connect.php: Получил две красивые строки: DB query error. убираешь из /bitrix/php_interface/after_connect.php строчку $DB->Query(«SET LOCAL time_zone=’Europe/Moscow'»); все восстанавливается Что сделать, чтобы время совпадало? |
|
Пользователь 123039 Заглянувший Сообщений: 1 |
$DB->Query(«SET LOCAL time_zone='».date(‘P’).»‘»); мне помогло |
|
Пользователь 44828 Эксперт Сообщений: 1132 |
у меня 1 секунда и не помогает ничего — иногда правда проверка сайта говорит, что все хорошо |
|
Пользователь 211624 Заглянувший Сообщений: 2 |
mne toje pomoqlo Spasibo |
|
Пользователь 173442 Заглянувший Сообщений: 35 |
#5 0 16.12.2014 01:56:13
Спасибо, отличное решение! P.S. http://dermanov.ru/#bx — профессиональная разработка сайтов на Битриксе и консультации |
||
|
Пользователь 122899 Заглянувший Сообщений: 6 |
Здесь проблема в PHP, которая не знает о новых часовых поясах. |
|
Пользователь 178479 Заглянувший Сообщений: 26 |
У меня похожая проблема была. Но правки в другом файле внес — after_connect_d7.php |
|
Пользователь 271478 Заглянувший Сообщений: 1 |
#8 0 01.11.2015 23:09:01
Спасибо! Мне это помогло. |
||
|
Пользователь 35427 Заглянувший Сообщений: 11 |
В хелпе самого битрикса написано: Установить часовой пояс php можно в /bitrix/php_interface/dbconn.php, например: Для базы данных добавьте в /bitrix/php_interface/after_connect_d7.php: В файл /bitrix/php_interface/after_connect.php Вместо Etc/GMT-3 укажите свой часовой пояс из списка: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Только вот непонятно. Пробовал писать во всех конфигах и в каждом в отдельности, ничего не помогло. Видимо, этого мало. |
|
Пользователь 347250 Постоянный посетитель Сообщений: 205 UA6EM Victor |
#10 0 02.02.2016 20:11:47
Плохая идея и столько телодвижений! 73! |
||
|
Пользователь 35427 Заглянувший Сообщений: 11 |
#11 0 02.02.2016 20:38:35 Ну, как говорится, Битрикс большой, ему видней. Когда возникла проблема, выполнил рекомендации, данные разработчиком. Потом еще вспомнил про часовой пояс в PHP.ini, привел в соответствие и все заработало. |
|
Пользователь 347250 Постоянный посетитель Сообщений: 205 UA6EM Victor |
#12 0 03.02.2016 08:05:29
Тогда самое время на виртуальный сервер переходить ))) 73! |
||
|
Пользователь 287523 Заглянувший Сообщений: 10 |
#13 0 26.07.2016 23:04:59 Виктор Медведев, идея не очень правильная. На сервере может работать несколько приложений, и раз уж есть возможность для каждого задать свое окружение — то лучше задать свое окружение. |
|
Пользователь 287523 Заглянувший Сообщений: 10 |
#14 0 26.07.2016 23:07:03
У меня сработало, на чистой установке на вагранте ubuntu-trusty. Специально не задавал таймзону в настройках php, все только по хелпу битрикса. |
||
|
Пользователь 347250 Постоянный посетитель Сообщений: 205 UA6EM Victor |
#15 0 27.07.2016 05:16:30
неправильно когда каждому сверчку свой шесток, ну если есть желание изображать администратора, тогда да ))) 73! |
||
|
Пользователь 631057 Посетитель Сообщений: 21 |
#16 0 19.06.2017 12:31:29 Сайт крутится локально в Docker контейнре Ubuntu — помогло сменить локальное системное время:
Не ты выбираешь Linux, а Linux выбирает тебя |
||
|
Пользователь 4791694 Заглянувший Сообщений: 6 |
#17 0 22.11.2020 21:07:30 мне помогло в php.ini выставить date.timezone =»Europe/Moscow» |
Просмотров: 15588
Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок: Время на БД и на сервере- Время отличается на 3600 секунд (цифра может быть разная, но чаще всего именно эта). Ошибка возникает, как правило, при установке веб окружения битрикс на VPS/VDS. Все из-за неправильных настроек временной зоны. Расскажу как исправить.
Провести тест, можно из административной панели битрикс, находится по пути: Администрирование-> Настройки-> Инструменты-> Проверка системы.
Так же, данную ошибку можно увидеть в модуле обмена с сайтом на стороне 1С. При попытке обмена вам может выдать ошибку «Авторизация не пройдена«- даже если уверены, что правильно внесли адрес сайта, логин пользователя с правом обмена и его пароль, а проверка подключения все равно не проходит- скорее всего у вас именно эта ошибка времени на БД и на веб сервере.
Есть два способа решения ошибки
Не очень правильный: Открыть на редактирование файл /bitrix/php_interface/after_connect_d7.php и внести в него строчку.
$connection->queryExecute("SET LOCAL time_zone='".date('P')."'");
После этого, чаще всего, ошибка исчезает и даже 1С проходит проверку авторизации. Но редко, бывает, что не срабатывает для 1С (хотя тест на стороне сайта покажет что все нормально). Есть правильный способ
Подключаемся к серверу по SFTP/FTP протоколу, открываем файл по пути /etc/php.ini (да, именно его, а не /etc/php.d/bitrixenv.ini). И вносим строчку
timezone = Europe/Moscow
Перезагружаем Apache командой
service httpd restart
Все, после этого и ошибка пропадет и 1С сконнектится с сайтом.
Дополнено: Смена часового пояса на уровне системы в CentOS
Предыдуший способ менят часовой пояс на уровне php. Можно сделать совсем правильно и гарантировано работоспособно: сменить часовой пояс в самой системе CentOS
Открываем терминал и вводим команды
- mv /etc/localtime /etc/localtime-old — бекапим файл часовых зон
- ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime — делаем ссылку на часовую зону
- date — убеждаемся что время правильное, выдаст текущую дату и время
PS: Само собой, если у вас 1С и сервер с сайтом работают в другом часовом поясе- выставляйте свой вместо Europe/Moscow
Поблагодарить и поддержать!
Поддержать выпуски видео уроков, поблагодарить за полезную инструкцию или заметку можно через:
Юманей
Мои каналы:
Каналы на которые я выкладываю видео. Контент дублируется, смотрите где удобнее.
Я не уверен, почему strtotime() в PHP возвращает другой результат в другом часовом поясе, даже если в качестве параметра указана одна и та же дата. Кто-нибудь знает ответ? Я также хочу знать, могу ли я выполнить аналогичную задачу (преобразование datetime в int для упрощения вычислений) с помощью другой функции, которая дает тот же результат в другом часовом поясе?
РЕДАКТИРОВАТЬ:
Пример: Если я использую strtotime('2011-09-19 00:00:00'), не должен ли он просто возвращать разницу между 'January 1 1970 00:00:00' и '2011-09-19 00:00:00' в секундах? Почему здесь проблема с часовым поясом? И могу ли я получить что-то, что дает разницу без проблемы с часовым поясом?
6 ответов
Лучший ответ
Вкратце: часовой пояс считается, потому что значение Unix Epoch считается в GMT.
В более широком смысле 2011-09-19 00:00:00 прибывает в Бангладеш почти через 6 часов, это 2011-09-19 00:00:00 в зоне GMT. Из-за этого промежутка прошло еще 21600 секунд в зоне GMT, когда такая же дата появляется в BD.
Поскольку расчет выполняется относительно GMT, вам нужно добавить эти 21600 секунд, чтобы получить фактическую разницу.
7
Muhammad Usman
5 Сен 2011 в 01:31
strtotime дает разные результаты в разных часовых поясах, потому что учитывает часовые пояса …
Из руководства strtotime:
Функция ожидает получить строку, содержащую английский формат даты, и попытается преобразовать этот формат в метку времени Unix (количество секунд с 1 января 1970 г. 00:00:00 по всемирному координированному времени).
Эта функция будет использовать переменную среды TZ (если она доступна) для вычисления отметки времени. Начиная с PHP 5.1.0, есть более простые способы определения часового пояса, который используется во всех функциях даты и времени. Этот процесс объясняется на странице функции
date_default_timezone_get().
Взгляните на mktime().
Начиная с PHP 5.1, перед вызовом mktime или strtotime.
6
Community
20 Июн 2020 в 12:12
Из руководства PHP:
Эта функция будет использовать переменную среды TZ (если она доступна) для вычисления отметки времени. Начиная с PHP 5.1.0 есть более простые способы определения часового пояса, который используется во всех функциях даты и времени. Этот процесс объясняется на странице функции date_default_timezone_get ().
http://php.net/manual/en/function.strtotime.php
1
Christopher Armstrong
3 Сен 2011 в 23:00
Из документации PHP на strtotime:
Эта функция будет использовать переменную среды TZ (если она доступна) для вычисления отметки времени. Начиная с PHP 5.1.0 есть более простые способы определения часового пояса, который используется во всех функциях даты и времени. Этот процесс объясняется на странице функции date_default_timezone_get ().
Попробуйте установить свой часовой пояс.
Я думаю, что, вероятно, у каждого программиста php будет один раз, когда эта функция заставит его действительно понять, как на самом деле php работает с функциями даты и времени.
Забавно эта функция, когда вы пытаетесь что-то вроде … эээ … например, предположим, что сегодня в этот самый момент 11 июля 2012 года в 13:00:00 (2012-07-11 13:00:00), а затем вы пытаетесь strtotime найти точно такой же момент дня, но на завтра:
$x = strtotime('2012-07-12 13:00:00');
$y = strtotime('+1 Day');
$z = $x-$y;
$ x и $ y в первых двух строках не вернут одно и то же, даже если вы проигнорируете счетчик минут и секунд, но $ z будет около 25200 или около 7 часов в разнице между этими двумя строками, если ваш сервер находится где-то в США, что GMT составляет -5 часов, но ваш браузер вызывает эту функцию из Берлина летом, где GMT +2 часа … LOL, теперь вы можете понять, как php работает с этой функцией;)
0
Jason Sturges
29 Июн 2012 в 06:51

При проверке соединения с сайтом 1С-Битрикс из 1С:Комплексная автоматизация, редакция 1.1 возникает ошибка:
Авторизация не выполнена.
Не удалось установить соединение с сервером. Проверьте имя пользователя и пароль.
Ответ сервера: failure
Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут. Вероятно неправильно настроены временные зоны. Выполните настройку и повторите обмен.
Не удалось установить соединение.
Имя пользователя и пароль в данном случае верные. Дело во времени на сервере базы данных. Для настройки времени необходимо сделать следующее.
1. Определим свой часовой пояс. Сделать это можно, например, здесь: http://php.net/manual/en/timezones.php
В моем случае это «Asia/Novosibirsk«.
2. Устанавливаем часовой пояс для PHP. Для этого нужно отредактировать файл /bitrix/php_interface/dbconn.php и внести в него следующее:
date_default_timezone_set(«Asia/Novosibirsk«);
3. Устанавливаем часовой пояс для MySQL в файле /bitrix/php_interface/after_connect.php:
$DB->Query(«SET LOCAL time_zone='».date(‘P’).»‘»);
В файле /bitrix/php_interface/after_connect_d7.php:
$connection->queryExecute(‘SET LOCAL time_zone=»‘.date(‘P’).‘»‘);
Часовой пояс будет браться из настроек PHP.
Иногда система может не содержать информацию об отмене перехода на зимнее время в РФ. В это случае можно использовать прямое указание сдвига относительно GMT, например, для Москвы будет:
date_default_timezone_set(«Etc/GMT-4»);
$DB->Query(«SET LOCAL time_zone=’Etc/GMT-4′»);
Ошибка при синхронизации Битрикс: время на сервере базы данных
Когда требуется выполнить синхронизацию с внешним источником данных (например, с 1С), то 1С Битрикс может выдать следующую ошибку: «Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут». Это означает, что необходимо проверить и настроить правильные временные зоны.
Разберем эту проблему детальнее. Можно выполнить простой фикс (грабли) в виде хука в файле /bitrix/php_interface/after_connect_d7.php
указать принудительно:
$connection->queryExecute("SET LOCAL time_zone='".date('P')."'");
Но мы рекомендуем разобраться детально в причинах проблемы, для этого подключитесь к серверу по SSH и проверьте командой ‘date’ время в операционной системе (здесь и далее мы работаем в CentOS 7.
В консоли мы сначала забекапим временные файлы:
[root@sx ~]# mv /etc/localtime /etc/localtime-backup
потом делаем линк на нужную нам часовую зону:
[root@sx ~]# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
И далее проверяем командой ‘date’ корректность нового времени.
Вот как это выглядит в терминале:
[root@sx ~]# mv /etc/localtime /etc/localtime-backup [root@sx ~]# date Wed Apr 8 17:19:38 UTC 2020 [root@sx ~]# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime [root@sx ~]# date Wed Apr 8 20:19:46 MSK 2020
Далее подключаемся в MySQL / MariaDB и проверяем тайм-зону командой:
select current_timestamp;
В консоли это выглядит так:
[root@sx ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 104506 Server version: 5.5.64-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. MariaDB [(none)]> select current_timestamp; +---------------------+ | current_timestamp | +---------------------+ | 2020-04-08 20:24:41 | +---------------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
Если в MySQL / MariaDB неверное время, то выполняем следующее по определению default_time_zone: идем в /etc/my.cnf (CentOS) или /etc/mysql/my.cnf (Ubuntu) и после:
[root@sx ~] sudo /etc/init.d/mysqld restart
Сложные случаи конфликта во времени в SysConfig
Иногда так происходит, что еще одна отсылка ко времени сервера есть в:
/etc/sysconfig/clock
Вы можете поменять тайм-зону через ‘tzselect’, а в SysConfig, например, может быть прописано: ZONE=America/New_York
Это решается достаточно просто:
[root@sx ~]# vim /etc/sysconfig/clock ZONE="Europe/Moscow" UTC=true ARC=false
Временные зоны в PHP
Сейчас переходим к PHP, здесь тоже может быть нюанс, поэтому смотрим: /etc/php.ini
(из него билдится уже /etc/php.d/bitrixenv.ini) в ini-файле корректируем или добавляем:
timezone = Europe/Moscow
После изменений в php.ini нужно рестартнуть Апач:
service httpd restart