Suspeito que o problema tenha a ver com algumas das nuances de strtotime()
.
strtotime()
pode pegar praticamente qualquer string e convertê-la em um carimbo de data / hora do Unix. O problema é que, quando a string não contém um fuso horário explícito, ela usa o que é definido por date_default_timezone_get()
. Porém, isso deve ser definido pelo usuário atual (é definido pelo proxy da conta). No entanto, a string da qual você está retirando $node->field_date->value
está implicitamente no UTC. Em outras palavras, acho que a string que está sendo analisada strtotime()
está sendo interpretada como em 'America / New_York' e não em 'UTC'.
A boa notícia é que você pode simplificar bastante sua situação. O item de campo para um período consiste em quatro partes
- 'value' é a data de início como uma string no UTC
- 'start_date' é um objeto DrupalDateTime que representa 'value'
- 'end_value' é a data final como uma string no UTC
- 'end_date' é um objeto DrupalDateTime que representa 'end_value'
Para um campo simples de data e hora, eles são
- 'value' é a data como uma string no UTC
- 'date' é um objeto DrupalDateTime que representa 'value'
Então, você pode trabalhar DrupalDateTime()
diretamente com o objeto. Além disso, esse date.formatter
serviço deve atrair o fuso horário adequado em uso pelo usuário que visualiza a página por padrão (além de usar o idioma ativo do usuário).
Eu suspeito que algo assim vai funcionar
$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'
);
Observe que adicionei o espaço reservado no formato 'P' para que você possa ver qual o fuso horário que o sistema pensa que está sendo usado.
Verifique se o fuso horário está configurado em admin / config / regional / settings e se o fuso horário do usuário é o que você espera. Verifique também se você tem o fuso horário adequado definido no seu php.ini (é a date.timezone
configuração); coisas estranhas acontecem quando isso não está definido (e não me lembro se isso causa um aviso no instalador ou no relatório de status quando não está definido. Lembro-me do problema, mas não se ele ficou comprometido).
date
recurso para acessar o DrupalDateTime. Por curiosidade, como você descobriu isso? Consegui descobrir que meu campo era do tipo,DateTimeItem
mas lá dentro não parece óbvio que exista um membro públicodate
(ouvalue
) público para essa classe.