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.DateTimeItem::propertyDefinitions()
, verás lo que está expuesto. Luego miraDateTimeComputed::getValue()
para ver cómo funciona. Todas las clases de elementos se pueden examinar de esa manera, pero solo un puñado usa valores calculados. Desearía que hubiera una mejor manera de exponer esto a la API.DateTimeItem::propertyDefinitions()
. Pensé que estaban sucediendo algunos métodos mágicos, pero quería entender cómo se crearon para poder entender mejor cómo acceder a otros campos también. Como dijiste, sería bueno si la API estuviera expuesta, pero esto ayuda. Gracias de nuevo.$node->field_date->date
, en lugar de$node->field_date->start_date
.Basado en el manejo de la conversión de zona horaria con PHP DateTime , modifiqué mi código para esto:
Y ahora mi fecha de salida está bien:
Esto funciona. Pero estoy seguro de que hay una manera de hacer esto usando la API de Drupal.
fuente
date_default_timezone_set(drupal_get_user_timezone());
Usualmente lo resuelvo de esta manera .:
fuente
Esto funcionó para mí:
fuente
Este código me está funcionando.
fuente
Ninguna de estas otras respuestas funcionó para mí. Esto es lo que finalmente terminé con:
fuente
Utilizo este fragmento para trabajar con fechas:
Puede obtener más información sobre el objeto Datetime aquí
fuente