PHP DateTime __construct() Zeitzeichenfolge (xxxxxxxx) an Position x konnte nicht analysiert werden

Lesezeit: 4 Minuten

Ich hatte diesen Konstruktionsfehler, als ich versuchte, ein neues DateTime-Objekt mit einem Zeitstempel zu erstellen:

Ausnahme: DateTime::_construct(): Fehler beim Analysieren der Zeitzeichenfolge (1372622987) an Position 8 (8): Unerwartetes Zeichen in DateTime->_konstruieren()

Der Objekterstellungscode lautet:

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

Wobei $dbResult->db_timestamp ein gültiger Unix-Zeitstempel aus einer Datenbank ist. Der betreffende Zeitstempel lautete:

1372622987

Ich würde diesen Fehler verstehen, wenn ungültige Formate übergeben werden, aber dies ist ein echter Zeitstempel.

Der Grund dafür ist sehr seltsam: Ich habe seitdem ein Skript ausgeführt, um ein neues DateTime-Objekt mit dem als fest codierten Wert übergebenen Zeitstempel zu erstellen, und es hat keine Fehler gemeldet.

Dies scheint ein Einzelfall gewesen zu sein, aber ich brauche eine Erklärung, falls es eine gibt, da ich es mir nicht leisten kann, dass dies noch einmal passiert.

  • Dein Code scheint zu funktionieren: codepad.org/3RxtyU4b

    – zerkleinern

    2. Juli 2013 um 14:04 Uhr

  • Der von Ihnen gepostete Fehler und der von Ihnen gepostete Code stimmen nicht überein. Der Fehler zeigt an, dass der Zeitstempel an die übergeben wird DateTime Konstruktor hat keinen führenden @ darauf, während der von Ihnen gepostete Code zeigt, dass er enthalten ist. Eines dieser Dinge ist ungenau.

    – Sean Hell

    2. Juli 2013 um 14:05 Uhr

  • @SeanBright Ich kann bestätigen, dass das Führen entfernt wird @ erzeugt genau diesen Fehler: codepad.org/ZPZmXi2x

    – zerkleinern

    2. Juli 2013 um 14:06 Uhr

  • Das ist sehr interessant. Ich kann versichern, dass das @ immer im Code war, und wie gesagt, es funktioniert immer außer diesem Vorfall. Ich frage mich, ob es nicht als einmalig interpretiert wurde. Kennen wir irgendwelche Probleme bei der Verwendung der {}-Notation, anstatt sie mit ‘.’ Notation?

    – Alex

    2. Juli 2013 um 14:19 Uhr

  • Ich wette, dass Ihr Datenbankergebnis null war.

    – Saeven

    17. August 2015 um 14:03 Uhr

Sie sollten stattdessen setTimestamp verwenden, wenn Sie es fest codieren:

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

in Ihrem Fall

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

  • Danke für deinen Beitrag. Das Seltsame ist, dass mein Code vorher und seitdem funktioniert hat, es war nur ein zufälliges Ereignis.

    – Alex

    2. Juli 2013 um 14:02 Uhr

  • Ich versuche immer, die richtigen Methoden anstelle von magischen Fäden zu verwenden. Ich weiß, dass @ und U funktionieren können, wenn sie richtig verwendet werden, aber sie erfordern eine zusätzliche Analyse durch den PHP-Prozessor, und wenn es eine Methode zum Festlegen des Zeitstempels mit einer Ganzzahl gibt, gewinnen Sie dabei einige Mikrosekunden.

    – Saamorim

    3. Juli 2013 um 9:16 Uhr

  • Das ist zu prozedural. Diese Antwort ist nicht objektorientiert. OOP verwendet Konstruktoren. Es ist ein Konstruktor verfügbar, also verwenden Sie ihn. Abani Mehers Antwort ist besser, denke ich.

    – Joker

    15. März 2016 um 21:45 Uhr


  • Ich würde dir zustimmen, wenn die DateTime unveränderlich war und ob es einen Konstruktor gab, der einen Zeitstempel akzeptierte. Für mich eine Lösung, die eine Schnittstelle klar definiert setTimestamp(int) ist einer Lösung vorzuziehen, die eine magische Zeichenfolge akzeptiert, ganz zu schweigen von den damit verbundenen Leistungsproblemen.

    – Saamorim

    16. März 2016 um 18:54 Uhr


Benutzer-Avatar
Rob W

Verwenden Sie die createFromFormat Methode:

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

AKTUALISIEREN

Ich empfehle jetzt die Verwendung von Kohlenstoff

  • Danke für die einzeilige Lösung.

    – Jekis

    14. Juli 2015 um 11:23 Uhr

  • Keine Sorge, unbedingt prüfen $start_date auf Gültigkeit vor der Verwendung.

    – Rob W

    14. Juli 2015 um 15:59 Uhr


  • .. das ist: $start_date === false (statt null), seit createFromFormat (soweit ich weiß) löst niemals Ausnahmen aus, wenn ein Fehler auftritt.

    – Kamafeder

    21. November 2018 um 1:40 Uhr

ändern Sie Ihren Code zu diesem

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

und es wird gut funktionieren

  • Das ist praktisch dasselbe, nicht wahr?

    – zerkleinern

    2. Juli 2013 um 14:00 Uhr


  • @crush – sieht gleich aus, aber Sie können versuchen, den Unterschied zu sehen

    – Abani Mehr

    2. Juli 2013 um 14:01 Uhr

  • Das @-Symbol macht den Unterschied. Sehen php.net/manual/en/datetime.formats.compound.php und sehen Sie sich den Eintrag “Unix Timestamp” an

    – Saamorim

    2. Juli 2013 um 14:04 Uhr

  • Der Code hat so funktioniert, wie er ist, er ist nur einmal fehlgeschlagen – es ist so schwer, ihn darauf festzulegen

    – Alex

    2. Juli 2013 um 14:04 Uhr

Das hat bei mir funktioniert.

   /**
     * 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 '';
    }

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

1335370cookie-checkPHP DateTime __construct() Zeitzeichenfolge (xxxxxxxx) an Position x konnte nicht analysiert werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy