#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’); Однако это обходной путь, а не решение.