Sospecho que el problema tiene que ver con algunos de los matices de strtotime()
.
strtotime()
puede tomar casi cualquier cadena y convertirla en una marca de tiempo de Unix. El problema es que cuando la cadena no contiene una zona horaria explícita, utilizará lo establecido por date_default_timezone_get()
. Sin embargo, eso debe establecerse desde el usuario actual (lo establece el proxy de la cuenta). Sin embargo, la cadena que está extrayendo $node->field_date->value
está implícitamente en UTC. En otras palabras, creo que la cadena se está analizando y strtotime()
se interpreta como 'America / New_York' y no 'UTC'.
La buena noticia es que puede simplificar mucho su situación. El elemento de campo para un rango de fechas consta de cuatro partes
- 'valor' es la fecha de inicio como una cadena en UTC
- 'start_date' es un objeto DrupalDateTime que representa 'valor'
- 'end_value' es la fecha de finalización como una cadena en UTC
- 'end_date' es un objeto DrupalDateTime que representa 'end_value'
Para un campo de fecha y hora simple son
- 'valor' es la fecha como una cadena en UTC
- 'date' es un objeto DrupalDateTime que representa 'value'
Entonces, puedes trabajar con el DrupalDateTime()
objeto directamente. Además, ese date.formatter
servicio debe incluir la zona horaria adecuada que usa el usuario que ve la página de forma predeterminada (además de usar el idioma activo del usuario).
Sospecho que algo como esto 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'
);
Tenga en cuenta que agregué el marcador de posición en formato 'P' para que pueda ver qué zona horaria cree que está usando el sistema.
Asegúrese de tener la zona horaria adecuada configurada en admin / config / regional / settings, y que su zona horaria de usuario es lo que espera. También asegúrese de tener la zona horaria adecuada establecida en su php.ini (es la date.timezone
configuración); Suceden cosas extrañas cuando esto no está configurado (Y fuera de mi cabeza, no recuerdo si eso causa una advertencia en el instalador o en el informe de estado cuando no está configurado. Recuerdo el problema, pero no si se produjo comprometido).
date
función para acceder a DrupalDateTime. Por curiosidad, ¿cómo resolviste esto? Pude darme cuenta de que mi campo era del tipo,DateTimeItem
pero dentro de eso no parece obvio que haya undate
(ovalue
) miembro público para esa clase.