2010-02-15 3 views
8

실제, 전체 내용 :이것은 PHP 버그입니까, 아니면 제 시간대/PHP 설정에 문제가 있습니까? 파일의

<?php 

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

try { 

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

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

날짜 시간 생성자는 그것을 구문 분석 할 수없는 경우 예외를 throw한다 문자열을 받아들입니다. 이것은 내 로컬 컴퓨터에서 잘 실행하지만 내 원격 서버 중 하나에 예외가 catch되지 않는 (다시, 나는 시도/캐치와 똑같은 코드를 사용 오전 ) : 원격 서버 곳에 대한

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct() [function.DateTime---construct]: Failed to parse time string (lol) at position 0 (l): The timezone could not be found in the database' in /var/www/html/site_com/rez/date.php:9 Stack trace: #0 /var/www/html/site_com/rez/date.php(9): DateTime->__construct('lol') #1 {main} thrown in /var/www/html/site_com/rez/date.php on line 9

설정 예외가 잡힌되지 않은 : 그것은 작동합니까

PHP Version 5.2.5

date date/time support enabled "Olson" Timezone Database Version 2007.9 Timezone Database internal Default timezone America/Chicago

Directive 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 no value no value

내 로컬 설정 : 로컬

PHP 5.2.10

date date/time support enabled "Olson" Timezone Database Version 0.system Timezone Database internal Default timezone System/Localtime

Directive 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 no value no value

, 그것은 예외 PRI를 잡는다 오류를 알리지 않습니다. 둘 다에 date.timezone는 아무 가치도 없다.

아마 내 내부 시스템의 시간대는 꺼져 있을까요? 내 로컬 상자는 우분투이고 내 리모콘은 CentOS이다. 아마 일치하지 않을 것이지만 PHP가 예외를 잡아서는 안된다.

참고 사항 관리자 권한이 없으므로 원격 상자에서 PHP를 업데이트 할 수 없습니다.

답변

10

내기가 PHP 버그입니다. 나는 PHP가 생성자에 던져진 예외를 포착하는 데 문제가 있다는 것을 알고 있으며, 여기에 무슨 일이 일어나고있는 것 같다.

이 버그이기 때문에, 옵션이

  1. 업데이트 서버의 PHP 버전이다;

    을 : 당신은이 옵션
  2. 사용 strtotime() 예를 들어 strtotime()

와 오류를 잡아 날짜를 찾거나, 당신이 필요로하는 경우 또는 DateTime의 객체 지향 스타일에 액세스하려는되지 않습니다 말했다 나는 비슷한 문제로 실행 는

<?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(); 
} 
+0

DateTime 클래스를 확장하고 위의 코드로 생성자를 재정의 할 수도 있습니다. 단, new DateTime 대신 parent :: __ construct() . 프로토 타입은 동일해야하므로 구문에 두 개의 매개 변수 (string $ str, DateTimeZone $ timezone = null)를 사용해야합니다.이를 통해 uncatchable 예외 __construct()가 문제의 원인인지 판단 할 수 있습니다. – Frankie

+0

그래, 난 strtotime을 사용하고있어 그것이 실패하지 않는지 확인한 다음, DateTime 생성자에 공급한다. 나는 확장하려고 노력할 것이다. –

+0

이것을 PHP 5.5.9ubuntu에서 재현 할 수 있습니다. – CarstenSchmitz

1

정확한 문제에 대한 확실하지하지만이 기능을 사용하여 시간대 설정하려고 :

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

을 그리고이 작동되는지 확인합니다.

+0

예외를 catch하지 않는 서버에는 이미 한 세트 (기본 표준 시간대 America/Chicago)가 있습니다. –

+0

예전에 이미이 문제를 시도했지만 아무 것도하지 않는 것 같습니다. –

+0

이것은 이상한 문제입니다. 그런 다음 그 해결책이 무엇인지 보겠습니다. – Sarfraz

0

, 사람을 도움이

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

희망으로 해결 할 수 있었다.

관련 문제