6 Stimmen

Wie setze ich eine MysQL-Variable (time_zone) aus Doctrine / Symfony?

Ich würde gerne wissen, wie ich die MySQL-Zeitzone auf UTC setzen kann ( SET time_zone = 'UTC' ) von Symfony/Doctrine aus, so dass ich beim Aufruf einer UNIX_TIMESTAMP() Funktion auf eine DATETIME in meiner Abfrage die UTC-Unix-Zeit und nicht die Unix-Zeit in der Zeitzone des Servers zurück.

Wie kann ich dies tun, entweder automatisch bei jeder Verbindung oder manuell vor diesen Arten von Abfragen, bei denen die Zeitzone einen Unterschied macht?

BTW, ich muss diese Konvertierung innerhalb der MySQL-Abfrage und nicht die Anwendung zu tun, so kann ich GROUP BY ein Intervall, das Epochenzeit erfordert.

5voto

Jeremy Kauffman Punkte 10073

Sie können dies über die configureDoctrineConnection Callbacks, die in ProjectConfiguration aufgerufen werden:

public function configureDoctrineConnection(Doctrine_Connection $connection)
{
  $connection->exec('SET time_zone = "UTC"');
}

Es kann zu Problemen kommen, wenn Sie mehrere Verbindungen verwenden.

(Die Antwort wurde bearbeitet, um eine zusätzliche Methode zu entfernen, die fehlerhaft war).

1voto

Bouke Punkte 10781

Ich würde versuchen, die projectConfiguration zu bearbeiten und etwas wie (ungetestet und ungeprüft) hinzuzufügen:

    $databaseManager = new sfDatabaseManager($this->configuration);
    $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
    $diff = $connection->execute("SET time_zone = 'UTC'");

Anmerkung, $options y $this->configuration ist nur in einer Aufgabe verfügbar, daher sollte dies vielleicht fest kodiert werden (ich glaube, der Standard ist 'doctrine' ).

0voto

Prasad Punkte 1824

Wenn Sie dies auf der Ebene der Symfony-Anwendung tun wollen, ist der Weg, dies in die config/settings.yml

all:
  .settings:
    default_culture: en_US
    default_timezone: Asia/Kolkata

0voto

Maxim Mandrik Punkte 317

Entschuldigung für die Antwort nicht auf MySQL, sondern auf Oracle DB . Ich habe lange Zeit nach Daten in der Oracle DB gesucht, aber nichts gefunden. Dies ist das einzige Thema, das auch das Problem diskutiert, aber nur in MySQL.

Vielleicht kann jemand helfen, für Oracle DB:

In der Datei config/services.yaml

Für Symofony 4:

services:
    Doctrine\DBAL\Event\Listeners\OracleSessionInit:
        arguments:
            - TIME_ZONE: 'UTC'
        tags:
            - { name: doctrine.event_listener, event: postConnect }

Für Symfony 2 und 3:

services:
    oci8.listener:
        class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
        arguments:
            - TIME_ZONE: 'UTC'
        tags:
            - { name: doctrine.event_listener, event: postConnect }

Oder Sie können die Argumente als Objekt in yaml schreiben:

arguments: { TIME_ZONE: 'UTC' }

0voto

Musa Haidari Punkte 1999

Für MySQL 8 und Symfony 5 können Sie folgendes zu config/services.yaml

services:
    Doctrine\DBAL\Event\Listeners\SQLSessionInit:
        arguments:
            - 'SET TIME_ZONE="+04:00"'
        tags:
            - { name: doctrine.event_listener, event: postConnect }

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