Skip to content

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

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

Featured Replies

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

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

Это на уровне форума. Но требуется получать корректное время на уровне 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 и она будет правильно форматироваться с учетом настроек форума либо пользователя.

  • Author
Что вы подразумеваете под уровень php?

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

 

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

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

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

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

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

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

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

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

 

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

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

  • Author
А 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

  • Author
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

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

  • Author

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

  • 3 months later...

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

 

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

Только вот зачем они это сделали?

Чтобы использовать пользовательские временные зоны относительно времени по UTC.

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.