J'ai un champ de date standard Drupal 'Ma date' (field_my_date). Je peux obtenir sa valeur:
$node->field_my_date->value // returns: "2017-12-14T08:00:00"
Mais je veux obtenir une chaîne de date formatée, qui devrait ressembler à: "14.12.2017".
Si j'analyse le champ dans le shell interactif (drush core-cli), je vois que je peux obtenir l'objet DateTimeFieldItemList ou DateTimeItem :
>>> $node->field_my_date
=> Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList {#8836
0: Drupal\datetime\Plugin\Field\FieldType\DateTimeItem {#8841},
}
>>> $node->field_my_date[0]
=> Drupal\datetime\Plugin\Field\FieldType\DateTimeItem {#8841
value: [
"value" => "2017-12-14T08:00:00",
],
}
Mais je n'ai trouvé aucune méthode pour reformater la chaîne de date. Existe-t-il une possibilité de définir le format de la chaîne de date de sortie? Ou dois-je reformater la chaîne de sortie, par exemple comme ça:
date("j.n.Y", strtotime($node->field_my_date->value));
Un champ de date a deux propriétés, value
pour stocker la date en UTC et date
, un champ calculé renvoyant un objet DrupalDateTime, sur lequel vous pouvez utiliser les méthodes getTimestamp () ou format ():
// get unix timestamp
$timestamp = $node->field_date->date->getTimestamp();
// get a formatted date
$date_formatted = $node->field_date->date->format('Y-m-d H:i:s');
Pour un champ de plage de dates:
// formatted start date
$start_date_formatted = $node->field_date->start_date->format('Y-m-d H:i:s');
// formatted end date
$end_date_formatted = $node->field_date->end_date->format('Y-m-d H:i:s');
La réponse acceptée est bonne, mais pour quiconque souhaite utiliser le nouveau DrupalDateTime voici quelques exemples.
I. Si vous avez une date et que vous souhaitez la formater, passez-la simplement à la méthode statique de la classe (DrupalDateTime) comme suit. Vous pouvez remplacer la chaîne par vos variables de date. Ci-dessous montre à la fois l'utilisation de la version statique et la version non statique de DrupalDateTime
$date = DrupalDateTime::createFromFormat('j-M-Y', '20-Jul-2019');
// Using the static method prints out: 20-Jul-2019:11:am
$date = new DrupalDateTime('now'); // grab current dateTime using NON static
$date->format('l, F j, Y - H:i'); // format it
// prints out nicely formatted version: Tue, Jul 16, 2019 - 11:34:am
// you can remove H:i and what's after it if you don't want hours or am pm
$date = new DrupalDateTime('now'); // grab current dateTime
// Or print $date->format('d-m-Y: H:i A');
// prints out: 16-07-2019: 11:43 AM
Plus d'exemples:
$date = new DrupalDateTime();
$date->setTimezone(new \DateTimeZone('America/Chicago'));
print $date->format('m/d/Y g:i a');
// The above prints current time for given Timezone
// prints : 07/16/2019 10:59 am
// Another variations of the above except it takes specific date and UTC zone
$date = new DrupalDateTime('2019-07-31 11:30:00', 'UTC');
$date->setTimezone(new \DateTimeZone('America/Chicago'));
print $date->format('m/d/Y g:i a');
// prints 07/31/2019 6:30 am
Pour les utiliser dans votre module/code, vous devez inclure les éléments suivants en haut de votre fichier;
use Drupal\Core\Datetime\DrupalDateTime;
Comment le tester avec Drush Enregistrer le code ci-dessus dans un script php laisser drush exécuter le srcipt après son démarrage drupal comme:
drush -r /path-to-your-drupal-documentRoot -l example.com scr ~/path-to your-script
Pour les multisites, assurez-vous d'utiliser http://example.com avec la version drush -l
Pour éviter le prochain problème de type Y2K (champs d'horodatage Unix manquant d'octet), les dates sont stockées dans les champs de date de SQL. L'objet entité va avoir la même valeur que celle renvoyée par le support de stockage (SQL).
Lorsque vous affichez cela à l'aide du code de rendu standard, le widget d'affichage gère le formatage. Vous pouvez définir cela dans le formulaire d'affichage d'entité.
Si vous faites cela dans votre code, vous devrez fournir le code de formatage vous-même. Il n'est pas difficile d'utiliser l'objet DateTime avec un code similaire à.
$new_datetime = DateTime::createFromFormat ( "Y-m-d\TH:i:sT", $row["timestamp"] );
$formatted_date $new_datetime->format('j.n.Y');
Il y a probablement un moyen de le faire dans twig, mais ce serait beaucoup plus facile dans un hook de prétraitement de modèle.