Это ошибка php, или что-то не так с моими настройками часового пояса / PHP? - PullRequest
8 голосов
/ 15 февраля 2010

Реальное, полное содержимое файла:

<?php

error_reporting(E_ALL);
ini_set(display_errors, 'on');

try {

    //$x = strtotime('blah');
    $x = new DateTime('lol');

} catch ( Exception $e ) {
        echo $e->getMessage();
}

Конструктор DateTime принимает строку, которая должна выдавать исключение, если не может его проанализировать. Это нормально работает на моей локальной машине, но на одном из моих удаленных серверов исключение не перехватывается (и снова я am , использующий try / catch и тот же код EXACT):

Неустранимая ошибка: необработанное исключение «Исключение» с сообщением DateTime :: __ construct () [function.DateTime --- construct]: Не удалось проанализировать строку времени (смеется) в позиция 0 (л): часовой пояс не может найти в базе данных "в /var/www/html/site_com/rez/date.php:9 Трассировка стека: # 0 /var/www/html/site_com/rez/date.php(9): DateTime -> __ construct ('lol') # 1 {main} брошенный в /var/www/html/site_com/rez/date.php на строка 9

Настройки для удаленного сервера, где исключение не перехвачено:

PHP Версия 5.2.5

дата / время включена поддержка Версия базы данных часовых поясов "Олсон" 2007.9 Внутренняя база данных часовых поясов Часовой пояс по умолчанию Америка / Чикаго

Директива Local Value Master Value date.default_latitude 31,7667 31,7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90,583333 90,583333 date.sunset_zenith 90,583333 90,583333 date.timezone нет значения нет значения

Мои локальные настройки, где это работает:

PHP 5.2.10

дата / время включена поддержка Версия базы данных часовых поясов "Олсон" 0.Системная база данных о часовых поясах по умолчанию Часовой пояс системы / местное время

Директива Local Value Master Value date.default_latitude 31,7667 31,7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90,583333 90,583333 date.sunset_zenith 90,583333 90,583333 date.timezone нет значения нет значения

Локально, он ловит исключение и печатает ошибку. date.timezone на обоих значениях не имеет значения.

Возможно, отключены только часовые пояса моей внутренней системы? Мой локальный ящик - Ubuntu, а мой пульт - CentOS, они, вероятно, несовместимы, но не должен ли PHP по-прежнему ловить исключение?

К вашему сведению: Я не могу обновить PHP на удаленной машине, поскольку у меня нет прав администратора.

Ответы [ 3 ]

10 голосов
/ 15 февраля 2010

Моя ставка на ошибку PHP. Я знаю, что раньше в PHP возникали проблемы с перехватом исключений в конструкторах, и, похоже, именно это и происходит.

Поскольку это ошибка, ваши варианты

  1. Обновить версию PHP сервера; Вы сказали, что это не вариант
  2. Используйте strtotime(), чтобы найти дату или, если вам нужен или нужен доступ к объектно-ориентированному стилю DateTime, отловите ошибку с помощью strtotime()

Например:

<?php

try {

    if (@strtotime($str) !== false) {
        $x = new DateTime($str);
    } else {
        throw new Exception("Failed to parse string ({$str})");
    }

} catch ( Exception $e ) {
    echo $e->getMessage();
}
1 голос
/ 15 февраля 2010

Не уверен насчет точной проблемы, но попробуйте установить часовой пояс с помощью этой функции:

date_default_timezone_set('Europe/London'); // or whatever timezone

И посмотри, работает ли это.

0 голосов
/ 13 июня 2014

Я столкнулся с подобной проблемой, смог исправить с

date('date format', $str);
date("Y-m-d", $news->created);

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...