Avatar billede doomstone-dk- Nybegynder
13. september 2009 - 16:34 Der er 7 kommentarer og
1 løsning

Bruger tidszone til server tids zone

Hej jeg har lidt hyr med at gøre sådan at min hjemmesiden kan klare flere tidszoner.

Jeg har fået det lavet sådan at jeg kan lave serverens tider om til brugerens tider. ved.
function toUserTime($timezone, $format, $time)
{
date_default_timezone_set($timezone);
echo date($format, $time);
}

- $timezone, brugerens tids zone.
- $format, formatet tiden skal vises i "H:i:s osv."
- $time, er så UNIX time stampet i "server timer"

Dog har jeg lidt problemer, da jeg har en side hvor brugeren kan indtaste en dato. Denne indtasting vil blive lavet om til et UNIX timespamp, via mktime(). Dog giver dette en forkert data, da serveren tror det er dens local time (GMT) og brugeren tror at den er hans locale tid (GMT +2).
Hvordan kan jeg lave dette så mktime() gennerer unix timespamtet ud fra min brugers tidszone?
Avatar billede arne_v Ekspert
13. september 2009 - 16:47 #1
date_default_timezone_set virker vel også på mktime !?
Avatar billede doomstone-dk- Nybegynder
13. september 2009 - 17:52 #2
Ja men problemet er at det sætter alt have php fortagers sig på den tids zone.
Har lavet lidt ændringer i mit script

Denne funktion skulle meget gerne lave en bruger's input dato om til server tid.

    protected function UserDateToServer($year, $month, $day, $hour, $min, $sek)
    {
        try
        {
            $userTimezone = new DateTimeZone($this->TimeZone);
            $ServerTimezone = new DateTimeZone($this->ServerTimeZone);
            $myDateTime = new DateTime($year."-".$month."-".$day." ".$hour.":".$min.":".$sek, $userTimezone);
            $offset = $ServerTimezone->getOffset($myDateTime);
            return $myDateTime->format('U') + $offset;
        }
        catch(Exception $e)
        {
            return time(); 
        }
    }

Denne skulle meget gerne lave en server tid om til en bruger tid
    protected function toDate($format, $time)
    {
        $userTimezone = new DateTimeZone($this->UserTimeZone);
        $ServerTimezone = new DateTimeZone($this->ServerTimeZone);
        $myDateTime = new DateTime(date("Y-m-d H:i:s", $time), $ServerTimezone);
        $offset = $userTimezone->getOffset($myDateTime);
        echo date($format, $myDateTime->format('U') + $offset);
    }

Det ser ud til at virke, men er stadig meget itvivl om den faktisk gør det rigtigt.
Avatar billede arne_v Ekspert
13. september 2009 - 19:41 #3
Den er vist gal.

Prøv med:

    public function UserDateToServer($year, $month, $day, $hour, $min, $sec) {
        try {
            $myDateTime = new DateTime();
            $myDateTime->setTimestamp(new DateTimeZone($this->TimeZone));
            $myDateTime->setDate($year, $month, $day);
            $myDateTime->setTime($hour, $min, $sec);
            return $myDateTime->getTimestamp();
        } catch(Exception $e) {
            return time();
        }
    }
Avatar billede arne_v Ekspert
13. september 2009 - 19:44 #4
Ups.

    public function UserDateToServer($year, $month, $day, $hour, $min, $sec) {
        try {
            $myDateTime = new DateTime();
            $myDateTime->setTimezone(new DateTimeZone($this->TimeZone));
            $myDateTime->setDate($year, $month, $day);
            $myDateTime->setTime($hour, $min, $sec);
            return $myDateTime->getTimestamp();
        } catch(Exception $e) {
            return time();
        }
    }
Anmeld misbrug
Avatar billede arne_v Ekspert
13. september 2009 - 20:05 #5
Og:

    public function toDate($format, $time)
    {
        $myDateTime = new DateTime();
        $myDateTime->setTimezone(new DateTimeZone($this->UserTimeZone));
        $myDateTime->setTimestamp($time);
        echo $myDateTime->format($format);
    }
Avatar billede doomstone-dk- Nybegynder
13. september 2009 - 20:44 #6
Tusind tak, mit hovede spinder stadig væk for at prøve at dette til at virke :D
Gider du skrive noget som et svar så du kan få dine venfortjænte point? :D
Avatar billede arne_v Ekspert
13. september 2009 - 20:54 #7
Hele pointen er at Unix tid er tidszone uafhængigt.

Bemærk at setTimestamp og getTimestamp kræver 5.3.

Og svar.
Avatar billede doomstone-dk- Nybegynder
13. september 2009 - 20:58 #8
Hmm min host servage køre 5.2.x dog virker det fint der.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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