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.DateTimeItem::propertyDefinitions()
, verá o que está exposto. Então olheDateTimeComputed::getValue()
para ver como isso funciona. Todas as classes de itens podem ser examinadas dessa maneira, mas apenas um punhado usa valores calculados. Eu gostaria que houvesse uma maneira melhor de expor isso à API.DateTimeItem::propertyDefinitions()
. Imaginei que havia alguns métodos mágicos acontecendo, mas queria entender como eles foram criados para que eu pudesse entender melhor como acessar outros campos também. Como você disse, seria bom se a API fosse exposta, mas isso ajuda. Obrigado novamente.$node->field_date->date
, em vez de$node->field_date->start_date
.Com base na manipulação de conversão de fuso horário com PHP DateTime , modifiquei meu código para isso:
E agora minha data de saída está boa:
Isso funciona. Mas tenho certeza de que existe uma maneira de fazer isso usando a API Drupal.
fonte
date_default_timezone_set(drupal_get_user_timezone());
Eu costumo resolver desta maneira:
fonte
Isso funcionou para mim:
fonte
Este código está funcionando para mim.
fonte
Nenhuma dessas outras respostas funcionou para mim. Foi assim que finalmente acabei:
fonte
Eu uso esse snippet para trabalhar com datas:
Você pode obter mais informações sobre o objeto Datetime aqui
fonte