Avatar billede hoppe11 Nybegynder
03. juni 2007 - 04:02 Der er 8 kommentarer og
1 løsning

GMT og tidszoner

Jeg skal lave en international side med forum, events og nogle andre forskellige ting. Der skal selvfølgelig angives tidspunkter og datoer rundt omkring. Jeg vil så her mene at det vil være det mest enkle at gemme alle tidstempler i databasen i GMT?

Jeg har følgende at arbejde ud fra:
- en table med alle lande samt landekoder på 2 bogstaver (ISO 639-2)
- et script som ud fra IP'en lokaliserer hvilket land klienten opholder sig i

Mit spørgsmål er så hvordan jeg ud fra det får angivet den lokale tid ud fra GMT?
Avatar billede intenz Novice
03. juni 2007 - 16:06 #1
Du er naturligvis også nødt til at have en tabel der viser hvilken forskel landet har i forhold til GMT (brug evt. www.klokken.dk). Denne information skal du så hente ud sammen med landet.

Du kan så køre alle dine tidsstempler gennem en funktion der 'konverterer' dem til 'de rigtige'.
I eksemplet herunder forudsætter jeg at du bruger time() til dine tidstempler.

<?
$diff = "+3"; // differencen fra GMT, her +3 timer
$time = time(); // tidstempel

function convert_time ($time) {
global $diff;

$time = $time*($diff*(60*60));
return $time;
}

$real_time = convert_time($time);
?>

Ikke testet eksempel, men burde vise ideen i det.
Avatar billede intenz Novice
03. juni 2007 - 16:09 #2
$time = $time*($diff*(60*60));

skal så selvfølgelig være:
$time = $time+($diff*(60*60));


:)
Avatar billede hoppe11 Nybegynder
03. juni 2007 - 18:37 #3
Jeg havde måske håbet der var en funktion i php som selv kunne konvertere hvis blot man havde land
Avatar billede 0xffff Nybegynder
03. juni 2007 - 19:11 #4
Du kan bruge nogle af PHPs indbyggede datofunktioner. Har lige inkluderet et eksempel fra PHP.net om den funktion som jeg tror du mangler. Når du så har offset fra GMT er det bare at håndtere resultatet og beregne det ud fra dine tidsstempler i db.


<?php
// Create two timezone objects, one for Taipei (Taiwan) and one for
// Tokyo (Japan)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");

// Create two DateTime objects that will contain the same Unix timestamp, but
// have different timezones attached to them.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);

// NOTE: $dateTimeJapan is not used further in this example

// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei
// object, but using the timezone rules as defined for Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST).
print("Number of seconds Japan is ahead of GMT at the specific time: ");
var_dump($timeOffset);

print("<br />Number of seconds Taipei is ahead of GMT at the specific time: ");
var_dump($dateTimeZoneTaipei->getOffset($dateTimeTaipei));

print("<br />Number of seconds Japan is ahead of Taipei at the specific time: ");
var_dump($dateTimeZoneJapan->getOffset($dateTimeTaipei)
    -$dateTimeZoneTaipei->getOffset($dateTimeTaipei));

print("<hr />");

?>

Number of seconds Japan is ahead of GMT at the specific time: int(32400)
Number of seconds Taipei is ahead of GMT at the specific time: int(28800)
Number of seconds Japan is ahead of Taipei at the specific time: int(3600)
Avatar billede hoppe11 Nybegynder
09. juni 2007 - 15:50 #5
jeg er ikke helt med på hvordan jeg f.eks. kan trække offset af Europe/Copenhagen

jeg skal ikke lave en lang beregning mellem to offsets, men der må være en måde man kan nøjes med at aflæse offset for en given tidszone?
Avatar billede hoppe11 Nybegynder
10. juni 2007 - 18:23 #6
Jeg troede der fandtes en nemmere løsning på det, men man skal jo huske sommertiderne skal medregnes :)

smid et svar

$datetimezone = new DateTimeZone('Europe/Copenhagen');
$datetime = new DateTime('now', $datetimezone);

$offset = $datetimezone->getOffset($datetime);

var_dump($offset);
Avatar billede hoppe11 Nybegynder
10. juni 2007 - 18:23 #7
<-- 0xffff
Avatar billede hoppe11 Nybegynder
10. juni 2007 - 19:54 #8
Men hvis man vil "omregne" en anden tid en den vi befinder os i lige nu, hvad gør man så? Jeg har i stedet for 'now' forsøgt at indsætte et unixtimestamp, men får fejl
Avatar billede hoppe11 Nybegynder
16. juni 2007 - 12:06 #9
lukker
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