Tempo usando asTime() não corrigir

0

Pergunta

no meu modo de exibição de Grade, eu tenho essa alterar a coluna de data e hora para usar o meu fuso horário

[
    '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',
]

então, na minha pesquisa eu tenho este modelo

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]);
    }

eu também tenho isso no meu 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'
        ],

no meu banco de dados o created_at é salvo como este 2021-11-22 11:28:16 UTC

como eu faço para mostrar o horário correto baseado no meu fuso horário? (Asia/Singapore)

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

Melhor resposta

0

Salvo datetimes data e hora, mas sem nenhuma referência ao UTC zona. Assim, é impossível autoformatação-los para a Ásia/Singapura datetime. Em vez de que, como você sabe que eles são UTC e a Asia/Singapore está UTC+8, você pode adicionar 8 horas ao seu datetimes.

Por isso, eu adicionei o código para:

  • Criar um objeto DateTime do created_at valor do campo.
  • Adicionar 8 horas.
  • Obter novos created_at valor, com 8 horas adicionado.
  • E vá em frente com seu código original.

Aqui você são:

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]);
}

E aqui está outro (talvez o melhor) maneira de converter datetime da UTC específicos do fuso horário: Data/Hora UTC Seqüência de caracteres para o Fuso horário

2021-11-24 13:16:29

existe uma maneira de fazer isso a nível global? ou tenho que fazer para ele toda vez que eu uso asDate() e asTime() ? porque todos os meus datetimes são salvos no banco de dados como data e hora.
Shaho

Eu uso para definir o fuso horário para toda a minha aplicação web, utilizando date_default_timezone_set(). Desta forma, o meu sistema está no fuso horário que eu quero, e datetimes são salvos no banco de dados de acordo com o fuso horário, para que eu possa usá-los como eles são armazenados.
José Carlos PHP

Usando Europe/London é má idéia. O reino UNIDO está usando o horário de verão do sistema, de modo que o fuso horário usaria UTC de datas no inverno, mas UTC+1 para datas no verão. Você deve usar new DateTimeZone('UTC') em vez disso, se seus times sempre são salvos como UTC.
Michal Hynčica

@MichalHynčica Você está certo, eu tenha editado a minha resposta obrigado!
José Carlos PHP

Em outros idiomas

Esta página está em outros idiomas

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