Je soupçonne que le problème a à voir avec certaines des nuances de strtotime()
.
strtotime()
peut prendre à peu près n'importe quelle chaîne et la convertir en horodatage Unix. Le problème est que lorsque la chaîne ne contient pas de fuseau horaire explicite, elle utilise ce qui est défini par date_default_timezone_get()
. Cela doit être défini à partir de l'utilisateur actuel, cependant (il est défini par le proxy de compte). Cependant, la chaîne que vous extrayez $node->field_date->value
est implicitement en UTC. En d'autres termes, je pense que la chaîne en cours d'analyse strtotime()
est interprétée comme dans 'America / New_York' et non dans 'UTC'.
La bonne nouvelle est que vous pouvez beaucoup simplifier votre situation. L'élément de champ pour une plage de dates se compose de quatre parties
- 'valeur' est la date de début sous forme de chaîne en UTC
- 'start_date' est un objet DrupalDateTime représentant 'value'
- 'end_value' est la date de fin sous forme de chaîne en UTC
- 'end_date' est un objet DrupalDateTime représentant 'end_value'
Pour un champ date / heure simple, ils sont
- 'valeur' est la date sous forme de chaîne en UTC
- 'date' est un objet DrupalDateTime représentant 'value'
Vous pouvez donc travailler DrupalDateTime()
directement avec l' objet. En outre, ce date.formatter
service doit extraire le fuseau horaire approprié utilisé par l'utilisateur qui affiche la page par défaut (en plus d'utiliser la langue active de l'utilisateur).
Je soupçonne que quelque chose comme ça fonctionnera
$node = Node::load(2100);
$start_date = $node->field_date->start_date;
$formatted = \Drupal::service('date.formatter')->format(
$start_date->getTimestamp(), 'custom', 'Y-m-d H:i:s P'
);
Remarque J'ai ajouté un espace réservé au format «P» pour que vous puissiez voir quel fuseau horaire le système pense être utilisé.
Assurez-vous que le fuseau horaire approprié est configuré dans admin / config / regional / settings et que le fuseau horaire de votre utilisateur est celui que vous attendez. Assurez-vous également que le fuseau horaire approprié est défini dans votre php.ini (c'est le date.timezone
paramètre); des choses étranges se produisent lorsque ce n'est pas défini (Et du haut de ma tête, je ne me souviens pas si cela provoque un avertissement dans l'installateur ou sur le rapport d'état lorsqu'il n'est pas défini. Je me souviens du problème, mais pas s'il s'est engagé).
date
fonctionnalité pour accéder à DrupalDateTime. Par curiosité, comment avez-vous compris cela? J'ai pu comprendre que mon domaine était du typeDateTimeItem
mais à l'intérieur, il ne semble pas évident qu'il y ait undate
(ouvalue
) membre public pour cette classe.