2013-07-02 16 views
33

:PHP DateTime __construct() konumunda zaman dize (xxxxxxxx) ayrıştırılamadı x bir zaman damgası kullanarak yeni DateTime nesnesi oluşturmaya çalışırken bu yapı hata vardı

Exception: DateTime::_construct(): Failed to parse time string (1372622987) at position 8 (8): Unexpected character in DateTime->_construct()

nesne oluşturma kodu:

$start_date = new DateTime("@{$dbResult->db_timestamp}"); 

$ dbResult-> db_timestamp, bir veritabanından alınan geçerli bir unix zaman damgasıdır. Geçersiz biçimler için bu hatayı anlayacak

1372622987

geçirilen, ancak bu gerçek bir zaman damgası geçerli: Söz konusu zaman damgası oldu.

bu çok garip nedeni: O zamandan beri sabit kodlanmış değeri olarak iletilen damgası ile yeni bir DateTime nesnesi oluşturmak için bir komut dosyası koştum ve artık hata bildirdi.

Bu kapalı biri olduğu görünüyor, ama eğer varsa bunun tekrar etmek için ben göze alamaz gibi ben bir açıklama gerekiyor.

+0

Kodunuz iş gibi görünüyor: http://codepad.org/3RxtyU4b – crush

+0

Yayınladığınız hata ve eşleşmiyor gönderdiniz kodu. Hata damgası yok 'DateTime' yapıcısına geçirilen belirtir lider' @ kodu gösterileri yayınlanmıştır süre 'Üzerinde, o dahil olduğunu. Bunlardan biri yanlış. –

+0

Ben lider '@' tam bu hatayı üretir çıkarmadan teyit edebiliriz @SeanBright: http://codepad.org/ZPZmXi2x – crush

cevap

61

kullanımını tavsiye:

$start_date = new DateTime(); 
$start_date->setTimestamp(1372622987); 

davanız Bu benim için çalıştı

$start_date = new DateTime(); 
$start_date->setTimestamp($dbResult->db_timestamp); 
+1

Girişiniz için teşekkürler. Garip bir şey benim kodum daha önce çalışmıştı ve o zamandan beri, sadece rastgele bir olaydı .. – Alex

+0

Her zaman sihirli diziler yerine uygun yöntemleri kullanmayı denerim. @ Ve U'nun düzgün bir şekilde kullanıldığında çalışabileceğini biliyorum, ancak php işlemcisi tarafından ek ayrıştırma gerektiriyorlar ve zaman damgasını ayarlamak için bir tamsayı kullanmak gerekirse, süreçte birkaç mikrosaniye kazanırsınız. – saamorim

+0

Bu çok prosedürel. Bu cevap nesne yönelimli değildir. OOP kurucuları kullanır. Mevcut bir kurucu var, bu yüzden kullanın. Abani Meher'in cevabı daha iyi, bence. – Yoker

10
bu

$start_date = new DateTime("@" . $dbResult->db_timestamp); 

için kodunuzu değiştirmeniz

ve ince

+0

Bu etkili bir şekilde aynı şey değil mi? – crush

+0

@crush - aynı görünüyor ama denemek ve farkı görebilirsiniz –

+2

@ sembolü bütün his yapan. Http://www.php.net/manual/en/datetime.formats.compound adresine bakın.php ve "Unix Zaman Damgası" girişini görün – saamorim

8

kullanın createFromFormat yöntemi çalışır:

$start_date = DateTime::createFromFormat("U", $dbResult->db_timestamp);

UPDATE

Ben şimdi bunu hardcode takdirde, bunun yerine setTimestamp kullanmalıdır Carbon

+1

Biriniz için teşekkürler hatlı çözüm. – Jekis

+0

Endişeye gerek yok, kullanmadan önce "$ start_date" değerini kontrol ettiğinizden emin olun. –

0
$start_date = new DateTime(); 
$start_date->setTimestamp($dbResult->db_timestamp); 
0

içinde.

/** 
    * return date in specific format, given a timestamp. 
    * 
    * @param timestamp $datetime 
    * @return string 
    */ 
    public static function showDateString($timestamp) 
    { 
     if ($timestamp !== NULL) { 
     $date = new DateTime(); 
     $date->setTimestamp(intval($timestamp)); 
     return $date->format("d-m-Y"); 
     } 
     return ''; 
    } 
İlgili konular