Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
cyrax_02

На форуме php-функция time() отстаёт на 3 часа...

Рекомендованные сообщения

09/19/16 08:59 (изменено)

php 5.3.3

На сервере временные зоны установлены корректные. В настройках php указано:

date.timezone = Europe/Moscow

 

php-функция time() на сайте возвращает корректное время,

на форуме (при выполнении форумного скрипта) - на 3 часа отстаёт.

 

Проверил - виноват вот этот код (initdata.php):

/**
* Fix for PHP 5.1.x warning
*
* Sets default time zone to server time zone
* @since 2.2.0.2006-05-19
*/
if ( function_exists( 'date_default_timezone_set' ) and !defined( 'DO_NOT_SET_TIMEZONE' ) ) // bug report 25566
{
if ( ! @date_default_timezone_get() )
{
	date_default_timezone_set( @ini_get('date.timezone') ? ini_get('date.timezone') : 'UTC' );
}
else
{
	date_default_timezone_set( 'UTC' );
}
}

А именно - последняя строка кода, которая сбрасывает [date.timezone] в глобальный [uTC]:

date_default_timezone_set( 'UTC' )

 

Объясните на пальцах логику приведённого кода. В данном случае функция [date_default_timezone_get] возвращает зону, установленную в [date.timezone] и далее (else) сбрасывает её в [uTC]. Зачем ?

Изменено пользователем cyrax_02

Поделиться сообщением


Ссылка на сообщение

Время на форуме форматируется с учетом временной зоны форума либо личных настройках пользователя. Для форматирование даты используйте функции форума.

Поделиться сообщением


Ссылка на сообщение
Время на форуме генерируется с учетом временной зоны форума либо личных настройках пользователя

Это на уровне форума. Но требуется получать корректное время на уровне php.

Проинициализировать переменную DO_NOT_SET_TIMEZONE ?

Поделиться сообщением


Ссылка на сообщение

Что вы подразумеваете под уровень php? Если временная зона переопределена значит вы находится в области форума, либо по крайней мере инициирован файл initdata.

Поделиться сообщением


Ссылка на сообщение
The documentation should have this info. The function time() returns always timestamp that is timezone independent (=UTC).

А для форматирования даты используйте встроенные методы локализации $this->registry->class_localization и она будет правильно форматироваться с учетом настроек форума либо пользователя.

Поделиться сообщением


Ссылка на сообщение
Что вы подразумеваете под уровень php?

Использование функций/методов php, не касаясь методов объектной модели (движка) форума.

 

А для форматирования даты используйте встроенные методы локализации $this->registry->class_localization

У меня один и тот же код выполняется и на сайте, и на форуме (хук).

Придётся для сайта использовать time(), для форума - движок форума. Не совсем красиво получается. Даже совсем некрасиво...

Поделиться сообщением


Ссылка на сообщение

Использование нативных функции для форматирование даты в ipb не совсем желательно, потому что у разных пользователей разное время.

Не знаю что у вас там, поэтому не знаю что посоветовать. Пишите свою отдельную функцию для даты - if time_zone == utc $time = time() + offset Но по хорошему нужно использовать методы форума раз это находится в форуме (IN_IPB)

Поделиться сообщением


Ссылка на сообщение
Использование нативных функции для форматирование даты в ipb не совсем желательно, потому что у разных пользователей разное время.

В моём случае дата используется для служебных целей (отображать баннер или нет) - требуется всегда серверное время.

Пока оставил такую заплатку:

 

$currentDateTime = ((date_default_timezone_get() == 'UTC')? time() + 3*3600: time());

Поделиться сообщением


Ссылка на сообщение

А time() не возвращает серверное время по UTC не зависимо от временной зоны?

Поделиться сообщением


Ссылка на сообщение
09/20/16 05:43 (изменено)
А time() не возвращает серверное время по UTC не зависимо от временной зоны?

А разве не должна ?

 

date.timezone string

Временная зона, используемая по умолчанию всеми функциями даты/времени. До версии PHP 5.4.0 эта директива работала только при неустановленной переменной TZ. Порядок приоритета используемых временных зон описан на странице date_default_timezone_get()

Чтение настройки временной зоны с помощью функции date_default_timezone_set() (если применимо)

 

Только до версии PHP 5.4.0: чтение переменной окружения TZ (если она не пуста)

 

Чтение значения ini настройки date.timezone (если задана)

 

Только до версии PHP 5.4.0: опрос операционной системы (если поддерживается и разрешено ОС). При этом используется механизм угадывания временной зоны. Этот механизм не всегда корректно работает. Если используется этот метод (все предыдущие не дали результата), будет выдано предупреждение. Не стоит полагаться на результат, полученный этим способом, вместо этого лучше задать в параметрах временной зоны date.timezone правильное значение.

Изменено пользователем cyrax_02

Поделиться сообщением


Ссылка на сообщение
09/20/16 06:36 (изменено)
The documentation should have this info. The function time() returns always timestamp that is timezone independent (=UTC).
В документации такого нет. Но есть в сообщении одного из пользователей (написать ведь можно что угодно...).

 

А вот из документации:

 

date.timezone string

The default timezone used by all date/time functions. Prior to PHP 5.4.0, this would only work if the TZ environment variable was not set. The precedence order for which timezone is used if none is explicitly mentioned is described in the date_default_timezone_get() page. See List of Supported Timezones for a list of supported timezones.

Изменено пользователем cyrax_02

Поделиться сообщением


Ссылка на сообщение

Написать можно, для этого там есть рейтинг сообщения и пример. В документации нет конкретного референса относительно time(), а функции работы с временем несколько, в том числе те кто зависимы от временной зоны. Unixtime это время прошедшее с определенной даты по utc, оно не зивисит от часового пояса.

Поделиться сообщением


Ссылка на сообщение
09/20/16 07:36 (изменено)

Вы правы. Сам себя запутал функцией date().

В сабжевом случае целесообразно для строкового форматирования серверного времени контроль временного сдвига:

 

if(($currentTimeZone = date_default_timezone_get()) != ini_get('date.timezone')) {
   date_default_timezone_set(ini_get('date.timezone'));
}
$date = date('Y-m-d H:i:s', $time());
if($currentTimeZone != date_default_timezone_get()) { date_default_timezone_set($currentTimeZone); }

Изменено пользователем cyrax_02

Поделиться сообщением


Ссылка на сообщение

Я тоже не понял смысла этого кода. При правильной настройке времени на форуме (серверное время отображается правильно) наблюдается временной сдвиг в 3 часа например в выполнении условий временного контента - http://ipbskins.ru/forum/topic13625.html/page__view__findpost__p__100432

 

При удалении этого кода или замене 'UTC' на 'UTC+3' проблема исчезает. Только вот зачем они это сделали?

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...