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.DateTimeItem::propertyDefinitions()
, vous verrez ce qui est exposé. Ensuite, regardezDateTimeComputed::getValue()
pour voir comment cela fonctionne. Toutes les classes d'objets peuvent être examinées de cette façon, mais seule une poignée utilise des valeurs calculées. Je souhaite qu'il y ait une meilleure façon d'exposer cela à l'API.DateTimeItem::propertyDefinitions()
. J'ai pensé qu'il y avait des méthodes magiques, mais je voulais comprendre comment elles ont été créées afin que je puisse mieux comprendre comment accéder à d'autres champs également. Comme vous l'avez dit, ce serait bien si l'API était exposée, mais cela aide. Merci encore.$node->field_date->date
, au lieu de$node->field_date->start_date
.Basé sur la gestion de la conversion du fuseau horaire avec PHP DateTime, j'ai modifié mon code en ceci:
Et maintenant ma date de sortie c'est bien:
Cela marche. Mais je suis sûr qu'il existe un moyen de le faire en utilisant l'API Drupal.
la source
date_default_timezone_set(drupal_get_user_timezone());
Je le résout généralement de cette façon:
la source
Cela a fonctionné pour moi:
la source
Ce code fonctionne pour moi.
la source
Aucune de ces autres réponses n'a fonctionné pour moi. C'est ce que j'ai finalement fini avec:
la source
J'utilise cet extrait pour travailler avec des dates:
Vous pouvez obtenir plus d'informations sur l'objet Datetime ici
la source