PDA

Pogčedajte punu verziju : Daylight Saving Time pitanje


Ilija Studen
06. 02. 2007., 10:44
Ovo me već neko vreme interesuje, ali nikako da studioznije pristupim problemu (čitao, znam istoriju, ali me opet buni).

Kako u PHP-u pravilno implementirati DST (Daylight Saving Time)? date('I') vraća da li je datum u DST ili ne. Iz manuala:

I (capital i) - Whether or not the date is in daylight saving time - 1 if Daylight Saving Time, 0 otherwise.

Problem je što ne znam šta tačno da radim sa tim. Da li je ova implementacija OK:

/**
* Return local time based on user's timezone and DST
*
* @param integer $timestamp Original, GMT time
* @param integer $timezone_offset Timezone offset in seconds
* @param boolean $use_dst
* @return integer
*/
function get_local_time($timestamp, $timezone_offset, $use_dst = false) {
$result = $timestamp + $timezone_offset;
if($use_dst && (integer) date('I', $result)) {
$result += 3600;
}
return $result;
}

zira
06. 02. 2007., 10:49
Pa ovo I ti vraca serversko vrijeme, a tebi treba korisnikovo? Mislim, moze biti da je server u DST, a da korisnik nije...

oliver
06. 02. 2007., 20:06
^Yep :) Ovo bi trebalo da ide u "user preferences" zajedno sa vremenskom zonom, pa da vrsis korekciju na osnovu toga kako je korisnik izabrao.

ivanhoe
07. 02. 2007., 00:25
a sta ce ti kasting u integer unutar IF ? Zar ne bi bilo logicnije da ga prebacis u boolean, ako vec hoces da explicitno radis cast... or am I missing the point?

Ilija Studen
07. 02. 2007., 03:50
a sta ce ti kasting u integer unutar IF ? Zar ne bi bilo logicnije da ga prebacis u boolean, ako vec hoces da explicitno radis cast... or am I missing the point?

Ma uopšte nije ni morao cast; tu funkciju sam kucao iz glave kao primer da ima nešto kao osnova za komentarisanje. Sve mi se čini da ću negde naći vBulletin ili tako nešto i bunariti po kodu da vidim kako su to oni rešili.

ivanhoe
07. 02. 2007., 05:19
Sa wikipedije:
Due to daylight saving time, UTC is local time at the Royal Observatory, Greenwich only between 01:00 UTC on the last Sunday in October and 01:00 UTC on the last Sunday in March. For the rest of the year, local time there is UTC+1

mada ako znas da li je na serveru na snazi DST, onda mozes da pretpostavis da je i korisniku, sem u prelaznim trenucima... i pod uslovom da se u njegovoj zemlji koristi, naravno..

Ilija Studen
07. 02. 2007., 06:14
Imam listu država kao resurs unutar koda koji uvek koristim tako da mi nije problem da dodam svojstvo državi da li koristi DST ili ne. Na osnovu toga bih mogao da napravim nešto što vB ima - polje u korisničkom panelu gde korisnik bira da li da mu se podrška za DST određuje automatski (na osnovu odabrane države) ili pak da li je uključena ili isključena bez obzira na državu.

Btw, ako ima neko vB sa sve kodom neka mi ga pošalje na mail (ilija.studen@gmail.com) da proučim kako su oni to rešili.

oliver
07. 02. 2007., 08:39
:1049:

zextra
07. 02. 2007., 13:47
@Ilija: da li si znao da u razlicitim drzavama DST pocinje i zavrsava se u razlicito vreme?

Daylight Saving Time transitions in 2007 (http://www.timeanddate.com/time/dst2007a.html)

zekica
07. 02. 2007., 20:25
Ja mislim da je najbolje koristiti date_default_timezone_set() (http://www.php.net/manual/en/function.date-default-timezone-set.php), ako je verzija PHP-a veca od 5.1, u suprotnom podesiti environment promenljinu TZ, jer sam sistem "zna" da li je u datoj vremenskoj zoni aktivan DST ili nije.

zextra
07. 02. 2007., 20:58
Ono sto sam zaboravio da kazem, to je da sam skoro citao o tome kako su neke zemlje pomerile datum pocetka/zavrsetka DST... Samo mi nije jasno zasto bi to neko uopste pomerao :)

zira
07. 02. 2007., 22:39
Uglavnom se vrijeme pomjera tako zbog dodatnih usteda u energiji, tj boljeg koristenja dnevne svjetlosti.

ivanhoe
08. 02. 2007., 01:44
Ja mislim da je najbolje koristiti date_default_timezone_set() (http://www.php.net/manual/en/function.date-default-timezone-set.php), ako je verzija PHP-a veca od 5.1, u suprotnom podesiti environment promenljinu TZ, jer sam sistem "zna" da li je u datoj vremenskoj zoni aktivan DST ili nije.

to je ok resenje za serversko vreme, ali kako ces sa korisnickim... ako promenis env. promenjivu da li ce to uticati na sve ostale procese ?

caiser
08. 02. 2007., 09:24
Ono sto sam zaboravio da kazem, to je da sam skoro citao o tome kako su neke zemlje pomerile datum pocetka/zavrsetka DST... Samo mi nije jasno zasto bi to neko uopste pomerao :)

USA je jedna od njih. :) I ta promena je valjda vazeca od ove godine.

zekica
08. 02. 2007., 12:17
to je ok resenje za serversko vreme, ali kako ces sa korisnickim... ako promenis env. promenjivu da li ce to uticati na sve ostale procese ?

Ne, environment promenljive su različite za svaki process na serveru, tako da njihova promena traje najduže do kraja izvršavanja date php skripte (ako pre toga ne vratiš vrednost na onu koja je bila).

ivanhoe
08. 02. 2007., 15:36
mislim da env varijable vazi za apache child proces u kome se izvrsava php, a ne samo za sam php ? Znam da sam negde citao da takve izmene mogu da na primer izazovu pogresno vreme u apache logovima...

zekica
08. 02. 2007., 16:12
Ok, onda bi nešto ovakvo radilo sigurno:

$oldTZ=getenv("TZ");
putenv("TZ=Europe/Belgrade");
echo date();
putenv("TZ=$oldTZ");

Ne znam kako to rade neke naprednije aplikacije, ali ovo je po meni najlogičnije rešenje.

ivanhoe
09. 02. 2007., 14:00
da, ovo je kul :)