2010-02-15 3 views
8

Die real, voller Inhalt der Datei:Ist das ein PHP-Bug, oder stimmt etwas nicht mit meinen Zeitzonen/PHP-Einstellungen?

<?php 

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

try { 

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

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

Der Datetime-Konstruktor akzeptiert eine Zeichenfolge, die eine Ausnahme auslösen soll, wenn sie es nicht analysieren kann. Dies läuft auf meinem lokalen Rechner in Ordnung, aber auf einem meines Remote-Server die Ausnahme nicht abgefangen wird (wieder Ich bin mit try/catch und exakt dem gleichen Code):

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

Einstellungen für Remote-Server, auf den die Ausnahme ist, nicht gefangen:

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

Meine lokalen Einstellungen, wo es funktioniert:

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

lokal, es fängt die Ausnahme und pri nts der Fehler raus. Die date.timezone auf beiden ist kein Wert.

Vielleicht sind nur die Zeitzonen meines internen Systems ausgeschaltet? Meine lokale Box ist Ubuntu und meine Fernbedienung ist CentOS, sie sind wahrscheinlich inkonsistent, aber sollte PHP nicht noch die Ausnahme fangen?

FYI Ich kann PHP auf der Remote-Box nicht aktualisieren, da ich keine Administratorrechte habe.

Antwort

10

Meine Wette ist auf einen PHP-Fehler. Ich weiß, dass PHP Probleme mit dem Abfangen von Exceptions in Konstruktoren hatte, und das scheint hier zu sein.

Weil es ein Fehler ist, Ihre Optionen sind

  1. Update, um die PHP-Version des Servers; Sie sagte dieser
  2. Verwendung ist keine Option strtotime() das Datum zu finden oder, wenn Sie mit strtotime()

Zum Beispiel benötigen oder den Fehler fangen, von DateTime zum objektorientierten Stil zugreifen möchten:

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

Sie könnten sogar versuchen, die DateTime-Klasse zu erweitern, und überschreiben den Konstruktor mit dem obigen Code, außer anstelle von new DateTime würden Sie parent :: __ construct() verwenden . Denken Sie daran, dass der Prototyp derselbe sein muss, also sollte Ihr Konstrukt zwei Parameter annehmen (string $ str, DateTimeZone $ timezone = null).Dies hat den zusätzlichen Vorteil festzustellen, ob der Fehler __construct() uncatchable exception die Ursache Ihrer Probleme ist. – Frankie

+0

Ja, ich benutze derzeit strtotime und stelle sicher, dass es nicht scheitert, dann füttere es dem DateTime-Konstruktor - ich versuche es zu verlängern. –

+0

Kann dies in PHP 5.5.9ubuntu reproduzieren. – CarstenSchmitz

1

Nicht sicher über die genaue Problem, sondern versuchen, die Zeitzone einstellen Verwendung dieser Funktion:

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

Und sehen, ob das funktioniert.

+0

Der Server, der die Ausnahme nicht abfängt, hat bereits einen Satz (Standardzeitzone America/Chicago). –

+0

Ja, ich habe das schon vorher versucht und es schien nichts zu tun. –

+0

das ist ein seltsames Problem dann, mal sehen, was ist die Lösung dafür dann – Sarfraz

0

ich in ähnliches Problem lief, konnte mit

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

Hoffnung beheben, die jemand hilft.