Sospetto che il problema abbia a che fare con alcune sfumature di strtotime()
.
strtotime()
può prendere praticamente qualsiasi stringa e convertirla in un timestamp Unix. Il problema è che quando la stringa non contiene un fuso orario esplicito, utilizzerà ciò che è impostato da date_default_timezone_get()
. Questo dovrebbe essere impostato dall'utente corrente, tuttavia (è impostato dal proxy dell'account). Tuttavia, la stringa che stai estraendo $node->field_date->value
è implicitamente in UTC. In altre parole, penso che la stringa che viene analizzata strtotime()
venga interpretata come in "America / New_York" e non "UTC".
La buona notizia è che puoi semplificare molto la tua situazione. L'elemento del campo per un intervallo di date è composto da quattro parti
- 'valore' è la data di inizio come stringa in UTC
- 'start_date' è un oggetto DrupalDateTime che rappresenta 'valore'
- 'end_value' è la data di fine come stringa in UTC
- 'end_date' è un oggetto DrupalDateTime che rappresenta 'end_value'
Per un semplice campo data e ora lo sono
- 'valore' è la data come stringa in UTC
- 'date' è un oggetto DrupalDateTime che rappresenta 'valore'
Quindi, puoi lavorare DrupalDateTime()
direttamente con l' oggetto. Inoltre, tale date.formatter
servizio dovrebbe richiamare il fuso orario corretto utilizzato dall'utente che visualizza la pagina per impostazione predefinita (oltre a utilizzare la lingua attiva dell'utente).
Sospetto che qualcosa del genere funzionerà
$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'
);
Nota Ho aggiunto il segnaposto in formato 'P' lì in modo da poter vedere quale fuso orario il sistema pensa sia in uso.
Assicurati di avere il fuso orario corretto impostato su admin / config / regional / settings e che il fuso orario dell'utente sia quello che ti aspetti. Assicurati anche di avere il fuso orario corretto nel tuo php.ini (è l' date.timezone
impostazione); accadono cose strane quando questo non è impostato (e dalla parte superiore della mia testa, non ricordo se ciò provoca un avviso nell'installer o sul rapporto di stato quando non impostato. Ricordo il problema, ma non se ha ottenuto commesso).
date
funzione per accedere a DrupalDateTime. Per curiosità come l'hai capito? Sono stato in grado di capire che il mio campo era del tipoDateTimeItem
ma al suo interno non sembra ovvio che ci sia undate
(ovalue
) membro pubblico per quella classe.