web-dev-qa-db-fra.com

PHP DateTime __construct () n'a pas pu analyser la chaîne temporelle (xxxxxxxx) à la position x

J'ai eu cette erreur de construction en essayant de créer un nouvel objet DateTime en utilisant un horodatage:

Exception: DateTime :: _construct (): Echec de l'analyse de la chaîne temporelle (1372622987) à la position 8 (8): caractère inattendu dans DateTime -> _ construct ().

Le code de création d'objet est:

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

Où $ dbResult-> db_timestamp est un horodatage Unix valide extrait d'une base de données. L'horodatage en question était:

1372622987

Je comprendrais cette erreur pour les formats non valides transmis, mais il s’agit d’un véritable horodatage.

La raison pour laquelle cela est très étrange: depuis, j’ai exécuté un script pour créer un nouvel objet DateTime avec l’horodatage transmis en tant que valeur codée en dur, et il n’a signalé aucune erreur.

Cela semble être un cas isolé, mais j'ai besoin d'une explication s'il en existe une, car je ne peux pas me permettre que cela se reproduise.

44
Alex

Vous devriez utiliser setTimestamp à la place, si vous le codez en dur:

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

dans ton cas

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

Utilisez la méthode createFromFormat:

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

[~ # ~] met à jour [~ # ~]

Je recommande maintenant l'utilisation de Carbon

14
Half Crazed

changez votre code pour cela

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

et ça marchera bien

11
Abani Meher

Cela a fonctionné pour moi.

   /**
     * 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 '';
    }
0
Sam Deering
$start_date = new DateTime();
$start_date->setTimestamp($dbResult->db_timestamp);
0
Bastien D