Čas pomocí asTime() není správné

0

Otázka

v mém zobrazení Mřížky mám změnit sloupec datum a čas použít své časové pásmo

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

pak se v mém hledání modelu mám

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

taky mám tohle v mém main.php komponenty

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

v mé databázi created_at je uložena jako je tato 2021-11-22 11:28:16 UTC

jak jsem si to ukázat správný čas na základě mé časové pásmo? (Asie/Singapur)

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

Nejlepší odpověď

0

Vaše uložené datetimes jsou datum a čas, ale žádný odkaz na UTC zóna. Takže, to je nemožné, aby automatický formát je do Asie/Singapur datetime. Místo toho, že, jak víte, že jsou UTC, a Asie/Singapur je UTC+8, můžete přidat 8 hodin na váš datetimes.

Tak jsem přidal kód:

  • Vytvořit DateTime objekt z created_at pole hodnota.
  • Přidat 8 hodin.
  • Získat nové created_at hodnota, 8 hodin, dodal.
  • A jít dopředu s vaší původní kód.

Zde jsou:

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

A tady je další (možná lepší) způsob, jak převést datum a čas z UTC na konkrétní časové pásmo: UTC Date/Time String časové Pásmo

2021-11-24 13:16:29

existuje způsob, jak dělat toto nastavit globálně? nebo mám pokaždé, když jsem použít asDate() a asTime() ? protože všechny moje datetimes jsou uloženy v DB jako je datum a čas.
Shaho

Jsem použít k nastavení časové pásmo pro celý web aplikace, pomocí date_default_timezone_set(). Tímto způsobem, můj systém je v časovém pásmu, které chci, a datetimes jsou uloženy v DB podle toho, časové pásmo, takže můžu použít tak, jak jsou uloženy.
José Carlos PHP

Pomocí Europe/London je špatný nápad. UK je používání letního času systém tak, že bude používat časové pásmo UTC pro termíny v zimě, ale UTC+1 pro data v létě. Byste měli použít new DateTimeZone('UTC') místo toho, pokud vaše časy jsou vždy uloženy jako UTC.
Michal Hynčica

@MichalHynčica máš pravdu, upravil jsem svou odpověď děkuji!
José Carlos PHP

V jiných jazycích

Tato stránka je v jiných jazycích

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