2010-02-15 15 views
8

il reale, intero contenuto del file:Si tratta di un bug di php o di qualcosa che non va nelle mie impostazioni di fuso orario/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(); 
} 

Il costruttore DateTime accetta una stringa, che dovrebbe generare un'eccezione se non è possibile analizzarlo. Questo funziona bene sulla mia macchina locale, ma su uno dei miei server remoti l'eccezione non viene catturato (e ancora una volta, io sono utilizzando try/catch e il codice esattamente lo stesso):

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

le impostazioni del server remoto in cui l'eccezione non viene catturato:

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

mie impostazioni locali in cui funziona:

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

A livello locale, cattura l'eccezione e pri nts l'errore. Il date.timezone su entrambi non ha valore.

Forse sono solo i fusi orari del mio sistema interno disattivati? La mia casella locale è Ubuntu e il mio telecomando è CentOS, sono probabilmente incoerenti ma PHP non dovrebbe ancora rilevare l'eccezione?

FYI Non riesco ad aggiornare PHP sul box remoto poiché non ho diritti di amministratore.

risposta

10

La mia scommessa è su un bug PHP. So che PHP aveva problemi con le eccezioni catturate nei costruttori, e sembra che stia succedendo qui.

Perché è un errore, le opzioni sono

  1. Aggiornamento versione di PHP del server; hai detto questa non è un'opzione
  2. Usa strtotime() per trovare la data o, se avete bisogno o vuole l'accesso allo stile orientato agli oggetti di DateTime, intercettare l'errore con strtotime()

Ad esempio:

<?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

Si potrebbe anche provare ad estendere la classe DateTime e a sovrascrivere il costruttore con il codice sopra, tranne invece di nuovo DateTime si utilizzerebbe parent :: __ construct() . Ricorda che il prototipo deve essere lo stesso, quindi il tuo costrutto dovrebbe prendere due parametri (stringa $ str, DateTimeZone $ timezone = null).Questo ha l'ulteriore vantaggio di determinare se il bug di eccezione uncatchable di __construct() sia la fonte dei tuoi problemi. – Frankie

+0

Sì, attualmente sto usando strtotime e mi assicuro che non abbia esito negativo, quindi lo inserisco nel costruttore DateTime - cercherò di estenderlo. –

+0

È possibile riprodurre questo in PHP 5.5.9ubuntu. – CarstenSchmitz

1

Non sono sicuro circa la questione esatta, ma provare a impostare il fuso orario di utilizzare questa funzione:

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

e vedere se questo funziona.

+0

Il server che non sta recuperando l'eccezione ha già un set (fuso orario predefinito America/Chicago). –

+0

sì ho già provato prima e non sembra fare nulla. –

+0

questo è un problema strano quindi, vediamo qual è la soluzione per esso quindi – Sarfraz

0

mi sono imbattuto in problemi simili, è stato in grado di risolvere con

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

Speranza che aiuta qualcuno.

Problemi correlati