RESOLVIDO: Fusos horários causando discrepâncias de data nas visualizações de lista do Drupal versus visualizações personalizadas

Recentemente, tive um problema em que nosso cliente tem uma lista de eventos (implementada como uma visualização simples do Drupal) e os campos de data de início / término do conteúdo são exibidos corretamente na visualização de lista, mas incorretamente no modelo de nó personalizado que usamos para exibir o completo nó desse evento.

Por exemplo, haveria um curso acontecendo em 3 de fevereiro. Ele apareceria como tal na Visualização, mas seria mostrado como 4 de fevereiro na página de detalhamento personalizado.

Esta página de detalhamento personalizada é algo que um membro da equipe criou como uma visualização, mas usou um campo PHP global para realizar alguma lógica específica sobre como exibir alguns outros dados associados à data em vez de um campo “data”. Como eles usaram o PHP Global, ele não se comportou da mesma maneira que o campo de data pronto para uso em uma visualização.

O que é pior, é que isso aconteceu apenas para alguns nós, e não todos eles.

Acabei percebendo o seguinte:

  • Ao usar campos de data prontos para uso em uma visualização do Drupal, você não precisa se preocupar em levar em consideração a diferença de tempo entre o fuso horário do servidor e o fuso horário associado ao campo de data. O Drupal cuida disso para você.

  • Os nós culpados foram todos criados um pouco perto da meia-noite, portanto, foram tratados como 3 de fevereiro pela visualização de lista, mas 4 de fevereiro pelo código personalizado, porque não havia reconciliação dos fusos horários.

  • Você precisa especificar o fuso horário do banco de dados ao converter a string em hora e, em seguida, usar o fuso horário do campo ao executar a função date_format. Ver abaixo:

(Para entender a importância dos parâmetros, você pode consultar a API Drupal aqui)

$date_converted = strtotime($date[0]['value'].' '.$date[0]['timezone_db']);

print format_date($date_converted, 'custom', 'j M Y', $date[0]['timezone']);

Por meio do uso da página API e de um artigo maravilhoso do StackExchange , fui capaz de raciocinar e resolver a discrepância.