Tiempo de uso de asTime() no es correcta

0

Pregunta

en mi vista de Cuadrícula tengo que cambiar la columna de fecha y hora a usar mi zona horaria

[
    'format' => [
       'class' => 'yii\i18n\Formatter',
       'timeZone' => 'Asia/Singapore',
    ],
    'attribute' => 'created_at',
    'label' => 'Date',
    'filter' => false,
    'value'=> function($model, $key, $index, $column){ return Search::getDateTime($model); }, }
    'format' => 'raw',
]

luego, en mi modelo de búsqueda que tengo este

public static function getDateTime($model) {

        $date = Yii::$app->formatter->asDate($model->created_at);
        $time = Yii::$app->formatter->asTime($model->created_at);

        return Html::a($date, null, ['href' => 'javascript:void(0);', 'class' => 'btn btn-link p-0 rounded-0 tooltips', 'data-toggle' => 'tooltip', 'data-placement'=> 'bottom', 'title' => $time]);
    }

también tengo esta en mi main.php componentes

'formatter' => [
            'class' => 'yii\i18n\Formatter',
            'dateFormat' => 'php:j M Y',
            'datetimeFormat' => 'php:d/m/Y h:i a',
            'timeFormat' => 'php:H:i A',
            'defaultTimeZone' => 'Asia/Singapore'
        ],

en mi base de datos de la created_at se guarda como este 2021-11-22 11:28:16 UTC

cómo hago para que muestre la hora correcta basada en mi zona horaria? (Asia/Singapore)

amazon-rds php yii2
2021-11-22 19:53:38
1

Mejor respuesta

0

Guardado datetimes son la fecha y la hora, pero no hay referencia a la UTC de la zona. Así, es imposible autoformato a Asia/Singapore datetime. En lugar de eso, como sabes que son UTC, y Asia/Singapore es UTC+8, puede agregar 8 horas a su datetimes.

Así que, he añadido el código para:

  • Crear un objeto DateTime de la created_at valor de campo.
  • Agregar 8 horas.
  • Obtener nuevo valor de created_at, con 8 horas añadido.
  • Y seguir adelante con su código original.

Aquí están:

public static function getDateTime($model)
{
    $datetime = new DateTime($model->created_at, new DateTimeZone('UTC'));
    $datetime->add(new DateInterval('PT8H'));
    $created_at = $datetime->format('Y-m-d H:i:s');

    $date = Yii::$app->formatter->asDate($created_at);
    $time = Yii::$app->formatter->asTime($created_at);

    return Html::a($date, null, ['href' => 'javascript:void(0);', 'class' => 'btn btn-link p-0 rounded-0 tooltips', 'data-toggle' => 'tooltip', 'data-placement'=> 'bottom', 'title' => $time]);
}

Y aquí está otro (tal vez mejor) manera de convertir datetime de UTC específicos de la zona horaria: UTC Cadena de Fecha y Hora de la zona Horaria

2021-11-24 13:16:29

hay una manera de configurar este mundial? o tengo que cada vez que lo uso asDate() y asTime() ? porque todos mis datetimes se guardan en la base de datos como la fecha y la hora.
Shaho

Yo lo uso para establecer la zona horaria para mi toda la aplicación web, utilizando date_default_timezone_set(). De esta manera, mi sistema está en la zona horaria que yo quiero, y datetimes se guardan en la base de datos de acuerdo a la zona horaria, por lo que puedo utilizar como ellos se almacenan.
José Carlos PHP

El uso de Europe/London es mala idea. El reino unido está usando horario de verano del sistema, de modo que la zona horaria haría uso de la UTC para las fechas en invierno UTC+1 para las fechas de verano. Usted debe utilizar new DateTimeZone('UTC') en cambio, si los tiempos son siempre guardado como UTC.
Michal Hynčica

@MichalHynčica tienes razón, he editado mi respuesta gracias!
José Carlos PHP

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................