Tempo utilizzando asTime() non è corretto

0

Domanda

nella mia Griglia di vista devo modificare la colonna di data e ora di usare il mio fuso orario

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

quindi nella mia ricerca ho questo modello

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

ho anche questo nel mio main.php componenti

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

nel mio database created_at viene salvato come questo 2021-11-22 11:28:16 UTC

come faccio a visualizzare l'ora corretta, basata sul mio fuso orario? (Asia/Singapore)

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

Migliore risposta

0

Salvate datetimes sono data e l'ora, ma nessun riferimento all'UTC di zona. Così, è impossibile formattazione automatica li Asia/Singapore datetime. Invece di questo, come si sa che sono UTC e Asia/Singapore: UTC+8, è possibile aggiungere 8 ore per il datetimes.

Così, ho aggiunto il codice per:

  • Creare un oggetto DateTime dal created_at valore del campo.
  • Aggiungere 8 ore.
  • Ottenere nuovi created_at valore, con 8 ore aggiunto.
  • E andare avanti con il codice originale.

Qui sono:

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 qui è un altro (forse migliore) modo per convertire datetime UTC di fuso orario specifico: UTC Stringa Data/Ora del Fuso orario

2021-11-24 13:16:29

c'è un modo per fare impostare a livello globale? o devo farlo ogni volta che lo uso asDate() e asTime() ? perché tutti i miei datetimes vengono salvati nel DB, come data e ora.
Shaho

Io uso per impostare il fuso orario per tutta la mia applicazione web, utilizzando date_default_timezone_set(). In questo modo, il mio sistema è nel fuso orario che voglio, e datetimes vengono salvati nel DB secondo fuso orario, così posso usarli come sono memorizzati.
José Carlos PHP

Utilizzando Europe/London è una cattiva idea. Regno UNITO è in vigore l'ora legale di sistema, in modo che timezone utilizzare UTC date in inverno, ma UTC+1 per le date in estate. Si dovrebbe usare new DateTimeZone('UTC') invece se i tuoi tempi sono sempre salvato come UTC.
Michal Hynčica

@MichalHynčica Hai ragione, ho modificato la mia risposta, grazie!
José Carlos PHP

In altre lingue

Questa pagina è in altre lingue

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