PHP date () возвращает разные значения для разных пользователей

#php #iis-8

#php #iis-8

Вопрос:

У меня проблема с тем, что некоторые пользователи получают разные даты в моем проекте. Проект выполняется под управлением PHP 7.4 на IIS.

Моя машина находится в Ванкувере, а пользователи — в Брисбене, Австралия

Я выделил проблему в коде ниже:

 $tzone = 'Australia/Brisbane';
$html  = '<br>Machine Date: '. date("Y-m-d H:i:s");
$html .= '<br>TimeZone: '. $tzone;
$tnow = new DateTime("now", new DateTimeZone($tzone));
$html .= '<br>Local Time: '.  $tnow->format('Y-m-d H:i:s') ;
echo $html;
 

Большинство пользователей (более 100) получают следующее (что ожидается):

 Machine Date: 2021-12-06 16:00:34
TimeZone: Australia/Brisbane
Local Time: 2021-12-07 10:00:34
 

Однако 2 получают:

 Machine Date: 2021-12-07 11:00:34
TimeZone: Australia/Brisbane
Local Time: 2021-12-07 10:00:34
 

Я предполагаю, что это как-то связано с конфигурацией этих пользователей, но не смог выяснить, что это такое. Пользователи правильно настроены на свои локальные часовые пояса, а их часы установлены на правильное время.

Комментарии:

1. Какой часовой пояс по умолчанию настроен на вашем сервере? Меняется ли это за сеанс? Возможно, вам следует включить это в свой вывод выше

2. Попробуйте перезагрузить сервер, чтобы он восстановил время. Затем попросите пользователей снова получить доступ, чтобы проверить, существует ли проблема.

3. @phil Я добавил в код строку date_default_timezone_get(). Для меня это работает правильно. Я жду, чтобы увидеть, что получит пользователь в Австралии. Будет обновляться, когда я получу ответ.

4. хорошо, date_default_timezone_get() возвращает машинный часовой пояс Америки / Ванкувера на всех машинах, кроме этих двух, которые возвращают Австралию / Мельбурн (что объясняет разницу в часах). Я предполагаю, что переопределение локальной машины каким-то образом передается. Я проверил их профиль AD, и там нет ссылки на Мельбурн, а их компьютеры настроены на Брисбен.

Ответ №1:

ЕСЛИ ВЫ РАЗРАБАТЫВАЕТЕ НА LOCALHOST

В кодах нет ничего плохого. МАШИННАЯ ДАТА отображает компьютерное время пользователя и не имеет ничего общего с указанной вами зоной.

На местное время влияет указанная вами зона.

Дата компьютера: = время локальных компьютеров пользователей (не зависит от указанной вами зоны)

Часовой пояс: вам нужно указать, какой часовой пояс должен влиять на последний $ html (местное время)

Местное время: зависит от указанного вами часового пояса.

ЖИВОЙ СЕРВЕР

На действующем сервере часовой пояс задается сервером, который вы используете.

Используйте часовой пояс PHP

 <?php

date_default_timezone_set('Africa/Lagos'); // set the default timezone here to use for machine date

$tzone = 'Australia/Brisbane';
$html  = '<br>Machine Date: '. date("Y-m-d H:i:s");
$html .= '<br>TimeZone: '. $tzone;
$tnow = new DateTime("now", new DateTimeZone($tzone));
$html .= '<br>Local Time: '.  $tnow->format('Y-m-d H:i:s') ;
echo $html;

?>
 

Комментарии:

1. Php запускается на сервере, и, следовательно, машинная дата генерируется сервером

2. да. отметил … я объяснил на основе localhost

3. date() должна возвращать дату на сервере, на котором выполняется скрипт. Это происходит в 100 случаях. Однако в 2 он возвращает 1 час, отличный от локальной даты. Да, я могу разрешить проблему с помощью date_default_timezone_set(‘America / Vancouver’); Однако это обходной путь, а не решение.