2013-07-02 6 views
33

miałem ten błąd budowlany podczas próby tworzenia nowego obiektu DateTime przy użyciu znacznika czasu:PHP DateTime __construct() Nie można analizować ciąg czasu (xxxxxxxx) w pozycji x

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

Kod tworzenie obiektu jest:

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

Gdzie $ dbResult-> db_timestamp jest prawidłowym znacznikiem czasowym unix pobranym z bazy danych. Znacznik czasu, o którym mowa, to:

1372622987

Zrozumiałbym ten błąd w przypadku przekazywania nieprawidłowych formatów, ale jest to prawdziwy znacznik czasu.

Powód jest bardzo dziwny: od czasu uruchomienia skryptu, aby utworzyć nowy obiekt DateTime ze znacznikiem czasu przekazanym jako zakodowana wartość, nie zgłoszono żadnych błędów.

To zdaje się być jednorazowe, ale potrzebuję wyjaśnienia, jeśli takie istnieje, ponieważ nie mogę sobie na to pozwolić.

+0

Kod wydaje się działać: http://codepad.org/3RxtyU4b – crush

+0

błąd pisał i kod zostały wysłane nie pasują. Błąd wskazuje, że znacznik czasu przekazywany do konstruktora 'DateTime' nie ma wiodącego' @ 'na nim, podczas gdy napisany kod pokazuje, że jest on zawarty. Jedna z tych rzeczy jest niedokładna. –

+0

@SeanBright Mogę potwierdzić, że usunięcie wiodącego '@' powoduje powstanie tego dokładnego błędu: http://codepad.org/ZPZmXi2x – crush

Odpowiedz

61

Należy użyć setTimestamp zamiast, jeśli go zakodować:

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

w przypadku

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

Dzięki za twój wkład. Dziwne jest to, że mój kod działał wcześniej i od tego czasu było to tylko przypadkowe zdarzenie .. – Alex

+0

Zawsze staram się używać właściwych metod zamiast magicznych ciągów. Wiem, że @ i U mogą działać poprawnie, ale wymagają dodatkowego przetwarzania przez procesor php i jeśli istnieje metoda ustawiania znacznika czasu, używając liczby całkowitej, zyskujesz kilka mikrosekund w procesie. – saamorim

+0

To jest zbyt proceduralne. Ta odpowiedź nie jest zorientowana na obiekt. OOP używa konstruktorów. Dostępny jest konstruktor, więc używaj go. Odpowiedź Abaniego Mehera jest lepsza, jak sądzę. – Yoker

10

zmienić swój kod do tego

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

i będzie działać dobrze

+0

To faktycznie to samo, prawda? – crush

+0

@crush - wygląda tak samo, ale możesz spróbować zobaczyć różnicę –

+2

Symbol @ powoduje różnicę. Zobacz http://www.php.net/manual/en/datetime.formats.compound.php i zobacz wpis "Unix Timestamp" – saamorim

8

użyć metody createFromFormat:

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

UPDATE

I teraz zalecają stosowanie Carbon

+1

Dzięki za jeden -line rozwiązanie. – Jekis

+0

Bez obaw, przed skorzystaniem sprawdź "$ start_date" pod kątem poprawności. –

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

Ten pracował dla mnie.

/** 
    * 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 ''; 
    } 
Powiązane problemy