Проблемы с часовым поясом при новой установке XAMPP с PHP 5.3 - PullRequest
2 голосов
/ 03 июня 2011

В ответ на объявление о том, что WordPress 3.2 (выйдет позднее в этом месяце) потребует PHP 5.2.4 + , я сегодня обновил свой тестовый компьютер Windows с XAMPP 1.5.5 до 1.7.4, что вturn поднял меня с PHP 5.2.0 на 5.3.5.

У меня почти все снова работает, но одна тестовая страница ведет себя странно.У меня есть таблица MySQL с идентификаторами tz по коду страны, и следующий скрипт определяет и отображает текущее время в каждом часовом поясе:

<?php
  echo "<table>";
  $result = mysql_query("SELECT * FROM zone_data ORDER BY `id` ASC;");
  while ($row = mysql_fetch_assoc($result)) {
    putenv("TZ=".$row['zone_name']);
    echo "<tr>";
      echo "<th>".$row['zone_code']."</th>";
      echo "<td>".$row['zone_name']."</td>";
      echo "<td>".date("D j M Y / H:i T",$_GET['t']);
        if (date("I") == 1) { echo "*"; } // asterisk if in DST
      echo " (".date("P",$_GET['t']).")</td>";
    echo "</tr>";
  }
  echo "</table>";
?>

Ожидаемый вывод, который прекрасно работает на производственном сервере в PHP5.2.17, должно быть примерно так:

Z   Etc/UTC          Fri 3 Jun 2011 / 03:22 UTC (+00:00)
AD  Europe/Andorra   Fri 3 Jun 2011 / 05:22 CEST* (+02:00)
AE  Asia/Dubai       Fri 3 Jun 2011 / 07:22 GST (+04:00)
AF  Asia/Kabul       Fri 3 Jun 2011 / 07:52 AFT (+04:30)
AG  America/Antigua  Thu 2 Jun 2011 / 23:22 AST (-04:00)
...

... но вместо этого мне говорят, что время совпадает с моим системным временем, America/New_York (в настоящее время UTC-4) в каждая зона:

Z   Etc/UTC          Thu 2 Jun 2011 / 23:22 EDT* (-04:00)
AD  Europe/Andorra   Thu 2 Jun 2011 / 23:22 EDT* (-04:00)
AE  Asia/Dubai       Thu 2 Jun 2011 / 23:22 EDT* (-04:00)
...

Теперь я заметил, что строка 1001 нового php.ini, установленного с XAMPP 1.7.4, изначально содержала date.timezone = Europe/Berlinпоэтому я заменил его на date.timezone = America/New_York.Но в обоих случаях каждый экземпляр функции date() определяется этим параметром независимо от того, что я сказал иначе с putenv().То же самое верно и для всех других страниц, использующих date() (хотя gmdate(), очевидно, возвращает GMT, как и ожидалось).

Я пытался закомментировать эту строку, но PHP 5.3.5 выдал lovely ошибки, говорящие о том, что «полагаться на настройки часового пояса системы небезопасно» и что мне требуется для использования директивы date.timezone в php.ini, хотя я всегда использую putenv(), когдаЯ использую date() или аналогичные функции.

Немного расстраивает необходимость установки «суперглобальной» настройки, особенно для случая, подобного этому, когда целое значение временно войдите в новую среду TZ и почерпните из нее некоторую полезную информацию.

Итак ... Есть ли способ заставить директиву date.timezone работать по умолчанию, которую можно переопределитьputenv() так, что последнее не полностью игнорируется?Есть ли еще что-то, о чем вы можете подумать, что может вызвать неожиданное / причудливое поведение, описанное выше?

Я склонен полагать, что это всего лишь некоторые настройки сервера, которые необходимо изменить, чтобы разрешить putenv()продолжить работу в PHP 5.3.5, как это было в 5.2.0 (и в 5.2.17).Конечно, если и есть «лучший путь», я не против услышать об этом (мне всегда нравится узнавать что-то новое!).Но в основном я хочу, чтобы мой старый код работал при моей новой установке.

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

1 Ответ

3 голосов
/ 03 июня 2011

Переменная окружения TZ игнорируется в PHP 5.3.(Страница справочника PHP для date_default_timezone_get описывает порядок, в котором будут рассматриваться различные настройки, включая то, что TZ применяется только для PHP <5.3). </p>

Простое решение: вместоputenv, используйте date_default_timezone_set для установки различных часовых поясов.

Вышеприведенное является наиболее прямой заменой putenv, но класс DateTime предлагает лучший способ сделать это.операции с датами в разных часовых поясах, не влияя на «текущий» часовой пояс для других операций с датами.DateTime конструктор может принимать аргумент DateTimeZone, который влияет только на часовой пояс для данного конкретного объекта (его также можно установить с помощью setTimezone():

$date = new DateTime(null, new DateTimeZone('Europe/Andorra'));
echo $date->format(/* your date format */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...