2010-02-15 19 views
8

gerçek, tam içeriği:Bu bir php hatası mı, yoksa timezone/PHP ayarlarında bir sorun mu var? Dosyanın

<?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 yapıcı bunu ayrıştırmak olamazsa bir istisna bir dize vardı, kabul eder. Bu benim yerel makinede iyi çalışır ama benim uzak sunuculardan biri durum yakalandı değildir (ve yine, try/catch ve AYNI TAM kodu kullanarak değilim ): uzak sunucuya nereye

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

Ayarlar durum yakalandı değildir: o nasıl çalışır

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

Benim yerel ayarları: yerel

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

, bu durum ve pri yakalar hatayı giderir. Her ikisinde de date.timezone değeri yoktur.

Belki de dahili sistemimin kapalı olan saat dilimi nedir? Yerel kutum Ubuntu'dur ve uzaktan kumandayı CentOS'dur, muhtemelen tutarsızlar ama PHP hala istisnayı yakalamamalı mı?

FYI Yönetici haklarına sahip olmadığımdan PHP'yi uzaktaki kutuda güncelleyemiyorum.

cevap

10

Bahisim bir PHP hatası üzerindedir. PHP'nin kurucularda atılan istisnai durumlarla ilgili sorunları olduğunu biliyordum ve buradaki gibi görünüyor.

bu bir hata olduğundan, seçenekleriniz

  1. Güncelleme sunucunun PHP sürümü vardır;

    : Bu bir seçenek
  2. Kullanım strtotime() Örneğin strtotime()

hatayı yakalayıp, tarihi bulmak ya, sen gerekiyorsa veya DateTime nesne yönelimli stil erişmek isteyen için olmadığını söyledi Ben benzer bir sorun koştu

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

Eğer DateTime sınıfını genişletmeyi deneyebilirsiniz ve yukarıdaki kodla kurucuyu geçersiz kılabilirsiniz, yeni DateTime yerine parent :: __ construct() kullanırsınız . Prototipin aynı olması gerektiğini unutmayın, bu yüzden yapınızın iki parametre alması gerekir (string $ str, DateTimeZone $ timezone = null).Bu, __construct() ayrılmamış özel durum hatalarının, sorunlarınızın kaynağı olup olmadığını belirleme yararına sahiptir. – Frankie

+0

Evet, şu anda strtotime kullanıyorum ve başarısız olmadığından emin olmak için onu DateTime yapıcısına besliyorum - genişletmeyi deneyeceğim. –

+0

Bunu PHP 5.5.9ubuntu'da yeniden üretebilir. – CarstenSchmitz

1

kesin konuda emin değil ama bu fonksiyonu kullanarak saat dilimini ayarlamayı deneyin:

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

Ve bu çalışıp çalışmadığına bakın.

+0

Kural dışı durumu yakalamayan sunucuda zaten bir tane var (Varsayılan saat dilimi Amerika/Chicago). –

+0

Evet, bunu daha önce denedim ve hiçbir şey yapmadı. –

+0

Bu garip bir sorundur, o zaman çözümün ne olduğunu görelim o zaman – Sarfraz

0

, birisi yardım

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

Umut ile düzeltmek başardı.

İlgili konular