Перейти к публикации
View in the app

A better way to browse. Learn more.

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

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

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

Сейчас на странице 0

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

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.