Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
cyrax_02

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

Recommended Posts

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]. Зачем ?

Edited by cyrax_02

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Время на форуме генерируется с учетом временной зоны форума либо личных настройках пользователя

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
The documentation should have this info. The function time() returns always timestamp that is timezone independent (=UTC).

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

Share this post


Link to post
Share on other sites
Что вы подразумеваете под уровень php?

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А 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 правильное значение.

Edited by cyrax_02

Share this post


Link to post
Share on other sites
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.

Edited by cyrax_02

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Вы правы. Сам себя запутал функцией 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); }

Edited by cyrax_02

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...