Ymmärtääkö date_default_time_zone kesä ja talviajan.
Aikaisemmin kelloajat menivät oikein, mutta nyt yhtäkkiä rupesi taas tunnilla heittämään. Tai siis, nyt huomasin, että taas heittää.
Hei,
Onkohan kellään ratkaisua ongelmaani. Palvelin ei sijaitse Suomessa ja kello heittää tunnilla, eikä date_default_time_zone auta ongelmaan. Missä vika ?
Muistaakseni kesäaikaa ei PHP ymmärrä kun varmaan siitä on kyse. Kesäaika EI OLE käytössä joka paikassa ja PHP uudet versiot tarvitsevat tiedon palvelimen sijainnista jotta ne voivat näyttää kelloja oikein.
Ainakin allekirjoittaneen hallinnassa olevat palvelimet ovat UTC ajassa ja sovellukset sitten sen mukaan mitä kieltä näytetään käyttäjälle. Kellomekaniikka on itse sovelluksessa siis, ei palvelimella.
-W-
Voihan sitä testata:
php -r "echo date(\"O\", 1199163600);"
+0200
php -r "echo date(\"O\", 1212638400);"
+0300
Eli osaa.
Edit:
Edellyttää tietysti että oikea aikavyöhyke käytössä:
php -r "date_default_timezone_set(\"Etc/GMT-2\"); echo date(\"O d.m.y H:i:s\");"
+0200 05.06.08 00:47:10
php -r "date_default_timezone_set(\"Europe/Helsinki\
+0300 05.06.08 01:47:27
php -r "date_default_timezone_set(\"Etc/GMT-2\");
+0200 06.06.08 13:15:19
php -r "date_default_timezone_set(\"Europe/Helsinki\
06.06.2008 14:15:19
Mutta kelloaika tällä hetkellä on
06.06.2008 15:15:00
Tästä kelloaika mekaaniikasta sitten vielä sen verran, että mistä se kelloaika poimitaan ellei palvelimelta. Paikallisella koneella kelloaika järjestelmään tallennetaan ihan oikein, mutta webin päällä ei. Eikä date_default_timezone_set(Europe/Helsinki) auta ongelmaan. Ilman sitä kylläkin heittää 2 tuntia. :)
Muistin varassa mennään taas kun en ei avaudu taas oikein kunnolla php.net:
Kokeile date('I') [iso i -kirjain] ja jos se palauttaa true eli 1, niin silloin on siis kesäaika, muuten ei. Sillä sitten voit laskea aikoja uudelleen tarpeen mukaan. En muista nyt ulkoa, että mistä PHP tuon tiedon oikein hakee ja lukee. Suomessa kesäaikaan tuon funktion pitäisi palauttaa TRUE!!! Jos ei palauta, lisää 1 tunti scriptissä.
Yksi ongelma tuossa koko hommassa on kuitenkin se, että jos palvelimen aikavyöhyke ja asetukset ovat sellaisessa maassa jossa tuote kesäaikaa ei käytetä (sitähän ei käytetä monessa maassa), niin kohtaat ongelmia. Silloin PHP alkaa bugittamaan noiden funktioiden kanssa. Kannattaa kokeilla Googlea, siellä on paljon hyviä vastauksia ja esimerkkejä.
-W-
Asiaan liittyen ja liittymättä:
Wizard kirjoitti:
ei avaudu taas oikein kunnolla php.net
Siis .fi-mirrorit? Ongelma valitettavan yleinen, ratkaisuna törkkää muun maan etuliitteen URLiin. Esim. dk on toiminut hyvin/aina varamirrorina.
Tulee vain tuossa mieleen se, että entä jos tekee merkinnän 00:00 ja lisään siihen itse tunnin, niin kumpi vuorokausi on kyseessä.
mennyt vai tuleva ?
Ja lopputulos on :
date('I') palauttaa arvon 1, eli true
ja aika heittää vielä sen tunnin, vaikka kesäaika on käytössä.
Pvm :07.06.2008 13:04:44
00:00 on aina "nykyinen aika", 23:59:59 on viimeinen edellisen vuorokauden puolella oleva aika. Vastaus kysymykseesi on se, että jos lisäät 00:00 aikaan tunnin, niin olet saman vuorokauden puolella. Jos lisäät aikaan 23:59:59 tunnin, niin joudut seuraavan vuorokauden puolelle.
Kaiva palvelimen PHP versio [phpinfo()] sekä sitten oletusasetukset aikavyöhykkeelle tietoon (löytyy myös phpinfosta). Sieltä löytyy asetukset ja ristiriitaisuuden syy.
-W-
Tuommosta pukkaa phpinfo.. Default timezone Europe/London
Miten tuohon pääsee käsiksi niin, että ottaa sen Europe/Helsinki käyttöön.
Palvelimen ollessa Englannissa, pitäisi funktion date('O') vastaukseksi tulla +0100 (tai vastaava). Talvisin Englannissa pitäisi olla +0000 saman funktion vastauksena. Jos ei tule, on vikaa jossakin ja nopein keino korjata tuo, on pakottaa kesäaikana yksi tunti lisää scripteihin.
Kokemuksesta voin sanoa, että tuo kesäaika on globaaleissa palveluissa (näkyvyys koko maailma) loputun suo ja siihen saa kirjoittaa yllättävän paljon koodia jos PHP alkaa bugittamaan. Silloin jotenkin arvostaa PHP tulkin koodareita kummasti...
Edit: sanottakoon kuitenkin vertailuksi, että yksi monista palvelimistamme sijaitsee Lontoossa ja testasin siellä tuota aikafunktiota. Siinä ei ollut mitään ongelmia ja se tulosti ihan oikean ajan. PHP versio oli 5.2.6 ja alla on tyypillinen Linux + Apache yhdistelmä.
Palvelimen ylläpitäjää varmasti kannattaa hätistellä tuon asian kanssa ja selittää hänelle kyseinen ongelma.
-W-
Kyllä.
Palvelimella oli php versio 5.2.2, kello heitti tunnin.
Paikallisella oli versio 5.2.4, kaikki meni oikein.
Eli kiitoksia tästä nyt toimii. Saa nähdä onko sama vika MySql:n kanssa.
funtio NOW jätättää 50 minuuttia.
Tästä viimeisestä laitan komennon takaisin. Ei ole mitään NOW() funktiota edes käytössä tässä kohtaa. En tiedä mistä sen siihen repäisin.
Olin laittanut date(H:m);
hahaa, tällähän se kusikin sen 30 min. ( väitin 50 min ) Olen hyvä kysyjä. :D
Oikeinhan se siis meni näin date('H:s:i')
Aihe on jo aika vanha, joten et voi enää vastata siihen.