3 Stimmen

Ändern Sie die Zeitzone für CGridView

Ich arbeite derzeit an einer Webanwendung, die es mir ermöglichen wird, die Zeitzone während der Ausführung zu ändern. Ich habe begonnen, einige Fälle zu testen, aber leider funktioniert es nicht für das CGridView.

Arbeitstests

Dieser Code hier funktioniert, um die Zeitzone zu ändern. Ich verwende die setTimeZone()-Funktion, die ein Wrapper für die date_default_timezone_set()-Funktion ist.

Yii::app()->setTimeZone("America/Montreal");
echo "mtl:".date("Y-m-d H:i", 1396624849)."";

Yii::app()->setTimeZone("Asia/Gaza");
echo "gz:".date("Y-m-d H:i", 1396624849);

Die Ausgabe macht viel Sinn (mtl:2014-04-04 11:20, gz:2014-04-04 18:20).

CGridView-Implementierung

Wenn ich die exakt gleiche Zeile in einer Ansicht mit einem CGridView ausprobiere, funktioniert es nicht und es wird nur mein Standard-Datumsformat angezeigt. Hier ist der Code:

Yii::app()->setTimeZone("Asia/Gaza");
echo Yii::app()->getTimeZone();
$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'reports-grid',
    'dataProvider'=>$dataProvider,
    'filter'=>$filtersForm,
    'columns'=>array(
        array(
            'header'=>'Date',
            'name'=>'inserted',
            'type'=>'raw',
            'value'=>'date(Yii::app()->params->dateformat, strtotime($data->inserted));'
        ), 
    ),
));

Das Ausgabedatum bleibt dasselbe, auch wenn ich die Zeitzone auf America/Montreal ändere.

Bisherige Versuche

Hinzufügen der setTimeZone()-Funktion zu einer Funktion mit der Datumsdefinition, wie folgt:

'value'=>function($data){
    Yii::app()->setTimeZone("America/Montreal");
    return date(Yii::app()->params->dateformat, strtotime($data->inserted));
}

Das Ergebnis war dasselbe wie zuvor.

Schlussfolgerung

Warum funktioniert es nicht? Gibt es eine Möglichkeit, die Zeitzone dynamisch in Yii zu ändern? Ist es möglich, dass es nicht funktioniert, weil das CGridView mit eval-Operationen erstellt wurde?

3voto

Gladhus Punkte 910

Versuchen Sie dies, es sollte funktionieren.

$dateTime = new DateTime();
$dateTime->setTimezone(new DateTimeZone('Asia/Gaza'));

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'reports-grid',
    'dataProvider'=>$dataProvider,
    'filter'=>$filtersForm,
    'columns'=>array(
        array(
            'header'=>'Datum',
            'name'=>'inserted',
            'type'=>'raw',
            'value'=>function($data) use ($dateTime){
                $dateTime->setTimestamp(strtotime($data->inserted));
                return $dateTime->format(Yii::app()->params->dateformat);
            }
    ))
));

Indem Sie die Zeitzone außerhalb der Funktion setzen und sie darin verwenden, sollte alles gut funktionieren.

1voto

Developerium Punkte 6993

Versuchen Sie das:

'value' => function($data){
    Yii::app()->setTimeZone("Asia/Gaza");
    return date(Yii::app()->params->dateformat, strtotime($data->inserted));
},

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X