letni/zimni čas dibi vs mysqli rubrika: Programování: PHP

3 Fidelio
položil/-a 26.10.2014

Zdravím,

pokud udělám mysqli_query($link,"SELECT caszalozeni FROM novinky ORDER BY caszalozeni DESC LIMIT 1");
dostanu v pořádku 2014-10-26 00:10:28

pokud to stejné udělám pomocí dibi:: query dostávám 2014-10-26 23:10:28

Mám nastaveno date_default_timezone_set('Europe/Prague'); co ještě kde upravit? googlím od rána, ale bez výsledku, chyba bude v tom připojení k dibi, ale netuším jak tam definovat set locale :(

odkaz
8 spazef0rze
odpověděl/-a 31.10.2014

Data typu TIMESTAMP jsou před uložením převedena do časové zóny UTC a při vybírání zase zpět z UTC do nastavené časové zóny MySQL serveru a pokud je při ukládání i vybírání časová zóna stejná, tak se vrátí ta samá data, co byla uložena. Pokud před voláním mysqli_query() se časová zóna nijak nenastavuje, tak se dá předpokládat, že je pořád stejná. Typ DATETIME toto nedělá.

Dibi nastavuje časovou zónu extra pomocí SET time_zone='$config[timezone]', přičemž defaultně je 'timezone' => date('P') a date('P') vrací teď +01:00, 26. 10. v 00:10:28 to vracelo +02:00. Časová zóna v době uložení je tedy jiná, než časová zóna při vybírání a tam vzniká ten hodinový rozdíl.

Nepíšeš pomocí čeho ty data ukládáš, ale pokud také pomocí dibi, tak databáze dostala příkaz k uložení 26. 10. 00:10 v časové zóně +02:00, vnitřně si uložila 25. 10. 22:10 a pokud ty data chceš teď vytáhnout, tak server dostane příkaz k vytažení 25. 10. 22:10 do aktuální časové zóny +01:00 a vytáhne 23:10.

K vyřešení (nebo aspoň pochopení) by mohlo stačit při připojování předat parametr timezone:

$options = array(
    'driver'   => 'mysql',
    'host'     => 'localhost',
    // ...
    'timezone' => date_default_timezone_get(), // např. takto
);

Dej vědět, jestli to pomohlo.

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.