Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

На форуме 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]. Зачем ?

Изменено пользователем 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 не зависимо от временной зоны?

  • Автор
А 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

  • Автор
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, оно не зивисит от часового пояса.

  • Автор

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

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

 

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

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

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

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.