Este pequeño post es más bien un recordatorio para mi futuro yo, porque de seguro voy a volver a tener que considerarlo.
Ya sea por cuestiones de configuración del stack o de alguno de los sistemas con los que intreactuamos, es posible que nos encontremos con la necesidad de tener que mostrar o enviar una fecha y hora que en la base de datos está almacenada con un timezone (posiblemente UTC-0) pero luego necesite que llegue para el timezone de la tienda (que podría ser otro).
Hace poco me topé con una situación como está, y la forma de solucionarlo es bastante sencilla.
Supongamos que necesito enviar la fecha de creación de un Pedido hacia un ERP. En mi código ya tenía el objeto del Pedido en cuestión, en la variable (vaya sorpresa) $order
.
Ahora bien, si envío $order->getCreatedAt()
, estaré enviando el valor que se almacenó en la base de datos con el tiemzone de la base de datos (no necesariamente con el de la tienda).
La forma de corregir esto sería haciendo uso de la interfase Timezone que provee el framework. Su implementación es sumamente sencilla.
Supongamos que tenemos una clase que es al que se ocupará de enviar ese valor a cualquier otro lado.
<?php
...
//Importamos la interfase
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
...
class MyClass
{
...
//Definimos la propiedad
private TimezoneInterface $timezoneInterface;
...
//Inyectamos la clase
public function __construct(
...
TimezoneInterface $timezoneInterface,
...
) {
...
//Asignamos la interfase a la propiedad
$this->timezoneInterface = $timezoneInterface;
...
}
//Y la usamos en nuestro método
public function sendOrder($order)
{
...
//Supongamos que estoy asignando el valor a un array que luego será enviado hacia el ERP
$data['order_creation_date'] = $this->timezoneInterface->date(
new \DateTime($order->getCreatedAt())
)->format('Y-m-d H:i:s');
...
}
}
El uso de la interfase nos permitirá garantizar que estamos manejando el valor de fecha y hora que está configurado y definido en el timezone de la tienda.