web-dev-qa-db-fra.com

Insertion de la valeur du formulaire de champ Datetime

J'ai un formulaire où l'utilisateur peut entrer datetime et je veux le stocker dans la base de données. Voici mon schéma:

'start' => array ('type' => 'varchar', 'mysql_type' => 'datetime', 'not null' => FALSE,),

La forme :

$ form ['add'] ['start'] = array ('#type' => 'datetime', '#default_value' => $ date,);

Lorsque je clique sur le bouton soumettre, cela me montre:

échec de db_insert. Message = SQLSTATE [22007]: Format de date/heure non valide: 1292 Valeur de date/heure incorrecte: ...

Ce que j'en ai retiré, c'est que le DateTime dans Drupal est incompatible avec MySQL. Des suggestions ou comment dois-je traiter la valeur du formulaire afin de pouvoir l'insérer dans la base de données?

Alternativement, une façon de convertir DrupalDatetime en chaîne?

(Pour ce que ça vaut, j'ai aussi essayé 'timestamp' comme type MySQL mais ça me lance la même erreur).

2
bravely23

Les champs Datetime dans Drupal 8 sont stockés sous forme de chaînes, en partie parce que la prise en charge de la date entre les bases de données n'est pas cohérente et en partie pour les rendre faciles à manipuler pour extraire des parties où il n'y a pas de fonctions de date appropriées.

La date est stockée au format DATETIME_DATETIME_STORAGE_FORMAT et le fuseau horaire est implicitement DATETIME_STORAGE_TIMEZONE.

Vous auriez besoin de faire quelque chose comme:

Avant Drupal 8.5

/** @var \Drupal\Core\Datetime\DrupalDateTime $date */
$date->setTimezone(new \DateTimezone(DATETIME_STORAGE_TIMEZONE));
$string = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);

Dans Drupal 8.5 et après, selon https://www.drupal.org/node/291298

/** @var \Drupal\Core\Datetime\DrupalDateTime $date */
$date->setTimezone(new \DateTimezone(DateTimeItemInterface::STORAGE_TIMEZONE));
$string = $date->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT);

Il existe cependant de meilleures façons de gérer cela. Il est préférable d'utiliser le service de formatage de date pour formater les dates, plutôt que la méthode ::format() (je suis paresseux ici). Il est également préférable d'utiliser les entités appropriées et de les ajouter en tant que champ, et pas seulement de les insérer dans une table de base de données.

14
mpdonadio

une façon de convertir DrupalDatetime en chaîne?

Oui, utilisez la méthode format , par exemple.

$formatted_date = $date->format('Y-m-d H:i:s');
2
Clive

Je ne sais pas vraiment ce que vous essayez de faire et à quel niveau d'API vous travaillez. Mais si vous essayez de stocker un timestamp dans un champ sql datetime, vous devez utiliser date('c') pour transmettre la date ISO 8601 sous forme de chaîne à mysql.

Cordialement,

Rainer

1
Rainer Feike

La réponse complète ci-dessus n'a pas fonctionné pour moi, donnez-moi l'indice de rechercher les formats de stockage.

Ma date était au format DATE (et notez DATETIME comme dans l'exemple donné) , utilisez donc la bonne constante.

constant DATETIME_STORAGE_FORMAT :: string(12) "Y-m-d\TH:i:s"
constant DATE_STORAGE_FORMAT :: string(5) "Y-m-d"

Exemple de travail.

$dtime = DateTime::createFromFormat("m/d/Y - G:i", $row->Date); // not needed
$dtime->setTimezone(new \DateTimezone(DateTimeItemInterface::STORAGE_TIMEZONE));
$dtimeFormat = $dtime->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);

$article->set('field_date', $dtimeFormat);
0
Pauleau