Avatar billede dp2001 Juniormester
25. maj 2018 - 10:00 Der er 8 kommentarer og
1 løsning

PHP mysqli time_zone

Har server+DB ved Gigahost. De siger at alt kører i UTC.

Jeg har i en simpel tabel lagt en dato ind med værdien 2018-05-25 09:16:00. Hvis denne er UTC forventer jeg at datoen er 2018-05-25 11:16:00 i Danmark.

Jeg korrigerer for de 2 timer, når jeg connecter, men jeg bliver ved med at få slynget 09:16:00 i hovedet.

Hvor dælen går det galt?

<?php

// DB-detaljer
$user = "hemmelig";
$pw = "hemmelig";
$server = "mysql99.gigahost.dk";
$db = "hemmelig_hemmelig";

// Connect og sæt time zone
date_default_timezone_set('Europe/Copenhagen');
$link = mysqli_connect($server,$user,$pw,$db);
mysqli_query($link,"SET time_zone = '+02:00';");

if (!$link)
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql_i = "SELECT unix_timestamp(now()) as dt, playtime from game_events where event_id = 1"; // I DB er datoen sat til 2018-05-25 09:16:00
$sql = mysqli_query($link,$sql_i);

while ($a_row = mysqli_fetch_object($sql))
{
    $dt = $a_row->dt;
    $playtime = $a_row->playtime;
}
               
echo "<br>DB now(): ".$dt;
echo "<br>Datoværdi hentet (forventer 2018-05-25 <i>11</i>:16:00): ".$playtime;

?>
Avatar billede acore Ekspert
25. maj 2018 - 11:07 #1
Jeg tror kun at kaldet til date_default_timezone_set påvirker date/time funktioner - dvs dem her http://php.net/manual/en/book.datetime.php.

Da du ikke bruger dem, men "bare" henter en dato i SQL, betyder det kald intet. SQL har sin egen timezone håndtering. Se https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html.
Avatar billede dp2001 Juniormester
25. maj 2018 - 11:11 #2
Per-connection time zones.

Each client that connects has its own time zone setting, given by the session time_zone variable. Initially, the session variable takes its value from the global time_zone variable, but the client can change its own time zone with this statement:

Smysql> SET time_zone = timezone;

Det er vel også det jeg gør her:
mysqli_query($link,"SET time_zone = '+02:00';");
Avatar billede acore Ekspert
25. maj 2018 - 11:16 #3
Sorry, det havde jeg overset i farten. Har du prøvet uden ovenstående linie? Gør det slet ingen forskel på output?
Avatar billede acore Ekspert
25. maj 2018 - 11:22 #4
Prøv med eksemplet vist i http://www.mysqltutorial.org/mysql-datetime/ under MySQL DATETIME vs. TIMESTAMP. Bruger du DATETIME eller TIMESTAMP?
Avatar billede dp2001 Juniormester
25. maj 2018 - 11:35 #5
Det gør desværre ingen forskel.
Avatar billede acore Ekspert
25. maj 2018 - 11:41 #6
og det andet spm?
Avatar billede dp2001 Juniormester
25. maj 2018 - 11:54 #7
Det er DATETIME - er lidt usikker på vejen frem...
Avatar billede dp2001 Juniormester
25. maj 2018 - 14:54 #8
OK. Det var egentlig bare at ændre datatypen fra datetime til timestamp i de berørte tabeller. Herefter skulle jeg lige justere alle datoer med en date_sub(playtime, interval 2 hour) og endeligt selvfølgelig implementere:

date_default_timezone_set('Europe/Copenhagen');
$link = mysqli_connect($server,$user,$pw,$db);
mysqli_query($link,"SET time_zone = '".date('P')."'");

Tak for at have guidet mig den rette vej!
Avatar billede acore Ekspert
26. maj 2018 - 20:31 #9
Godt du fandt ud af det - og så lærte jeg også noget
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester