Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

sabiranje datuma na prelazu letnje - zimsko vreme...

[es] :: PHP :: sabiranje datuma na prelazu letnje - zimsko vreme...

[ Pregleda: 4976 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zgas

Član broj: 74613
Poruke: 334
*.ptt.yu.

Sajt: odbrojavanje.com


Profil

icon sabiranje datuma na prelazu letnje - zimsko vreme...18.09.2007. u 15:19 - pre 201 meseci
Da li postoji problem koji treba predvideti, ako se sabira na primer jedan datum-vreme i nekoliko dana-sati tako da taj rezultat prelazi iz letnjeg u zimsko vreme? Da li tu treba nekako obracunati i pomeranje sata, ili to PHP(5) nekako radi automatski?

Hvala unapred.
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.ADSL.neobee.net.



+2 Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...19.09.2007. u 02:17 - pre 201 meseci
Pozd.

Nema shta da se brine. Pretpostavljam da koristish mktime() il gmmktime() za kreiranje datuma u buducnosti/proshlosti. Obe funkcije vracaju unix timestamp, koji predstavlja broj sekundi koji je proshao od 1. Januara 1970 u ponoc po UTC vremenu. Znachi taj broj oznachava VALIDNE sekunde. To znachi da u nekoj chasovnoj zoni, unitimestamp 100 mozhe da kazhe da je to 12. Oktobar 2007 u 01:59:59, dok ce unixtimestamp 101 (znachi naredna sekunda) u toj istoj chasovnoj zoni reci da je to sad 12. Oktobar 2007 u 03:00:00 (jer je zbog daylight savings sat pomeren unapred). To ce sve uraditi PHP, u sebi ima detaljno definisane sve chasovne zone koje postoje kao i raznorazna pravila koja zavise od podruchja kako bi se datum pravilno rachunao. Brojevi 100 i 101 su ovde da bi stvar bila ochiglednija, ne odgovaraju zaista prikazanim vremenima.

Svako dobro.
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.yu.

Sajt: odbrojavanje.com


Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...19.09.2007. u 07:37 - pre 201 meseci
Hvala znaci mktime() i gmmktime() ne bi trebali da prave gresku u racunanju vremena u buducnosti teoriski, ali...:

Citao sam negde u PHP dokumentaciji da ove ili jedna od ovih funkcija imaju bagove u PHP4 verziji. Evo pogledajte, u pitanju je prelaz zimsko pemeranje sata, kada razlika imedju dva dana nije, kako bi trebala biti '-86400' vec je '-90000':
Code:

There are several notes for mktime which use the number 86400 to differentiate two days. 
However this technique may pose a problem in case there is a day where the hour change between the two dates to compare.
Consequently, if you want the timestamp difference between the day where the hour change and the next day, 
it will not be equals to 86400 but either 82800 in case its the winter change of hour day or 90000 for the summer change of hour day.
For example in 2006 :

echo mktime(0,0,0,10,29,2006) - mktime(0,0,0,10,30,2006); // -90 000


Molim vas, kao izbeci ovaj problem. Zbog njega sam i postavio ovo pitanje.


[Ovu poruku je menjao zgas dana 19.09.2007. u 21:44 GMT+1]
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.ADSL.neobee.net.



+2 Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...20.09.2007. u 01:12 - pre 201 meseci
Pozd.

Ovo nije problem. Funkcija ti vraca realan broj sekundi u aktuelnoj chasovnoj zoni. Kada se vreme pomeri sat vremena unapred (nakon 01:59:59 dodje 03:00:00), fizichki je vreme skraceno za sat vremena, i zbog toga broj sekundi u danu je manji. Kad bi ignorisali tu chinjenicu, imali bi "fantomske sekunde", odnosno sekunde koje nisu nikad ni postojale.

Sad zavisi šta u stvari želiš da postigneš. U našoj zoni, kad se sat pomera unapred, između 2 ujutru prvog, i 2 ujutru drugog dana prošlo je fizičkih 23 sata. U UTC zoni, između istih vremena, prošlo je 24 sata, jer daylight savings se ne primenjuje na UTC. Isto tako kad se vreme bude vraćalo, imaćeš dan koji je trajao 25 sati u našoj zoni, i standardno 24 sata u UTC zoni. Dakle, kombinuj obe funkcije već prema tome šta želiš da postigneš, mktime() će raditi po aktuelnoj chasovnoj zoni, a gmmktime() po UTC zoni.

Svako dobro.
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.yu.

Sajt: odbrojavanje.com


Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...20.09.2007. u 07:02 - pre 201 meseci
Da, hvala stsung; meni je potrebno da korisniku dam informaciju koliko mu je fizicki ostalo vremena za odredjen posao. Tu kalkulaciju ce da odradi mktime() kako si rekao.

Da li bi mogao da das komentar i za ovaj slucaj:

Ako u bazi belezim dogadjaj po UTC vremenu u unix formatu, a korisniku zelim da dam informaciju koliko mu je ostalo realnog vremena do tog dogadjaja (ako se u tom periodu pomera sat) kako bi se mogao prikazati taj proces racunanja i kojim funkcijama se on u praksi sprovodi?

Znaci ako buduce dogadjaje u bazi belezim po UTC vremenu, onda korisnik, kako si rekao, nece dobiti pravu 'fizicku' informaciju koliko mu je realno ostalo vremena do dogadjaja, jer se u tom periodu pomera sat:
Code:
{buduce UTC unix verme - iz baze} - {sadasnje UTC vreme - pristupa korisnika} = {vremenska razlika nece biti realana}


Da bi korisnik dobio realnu informaciju koliko mu je ostalo do dogadjaja (ako se u tom periodu menja vreme i ako je cinjenica da se taj buduci dogadjaj belezi u bazi po UTC vremenu. Mislim da bi trebalo uraditi sledece:
Code:

  
  $unix_trenutak_u_leto  = 1190276804; // pomeranje vremena u ovom UTC trenutku za Beograd je = 7200 (sec.) zbog letnjeg racunanja (ukljucen DST)
  
  $unix_trenutak_u_zimu = 1198142866; // pomeranje vremena u ovom UTC trenutku za Beograd je = 3600 (sec.) zbog zimskog racunanja (iskljucen DST)
  
/////////////////////// RACUNANJE PERIODA //////////////////////////////////////////////////
  
  // podesiti prvo u kojoj smo vremenskoj zoni
  date_default_timezone_set('Europe/Belgrade'); 

  
  $korekcija_zbog_promene_vremena = date("Z", $unix_trenutak_u_zimu) - date("Z", $unix_trenutak_u_leto); 
  
  $rezultat_u_sekundama = $unix_trenutak_u_zimu - $unix_trenutak_u_leto + $korekcija_zbog_promene_vremena;


Da li je ova kalkulacija ispravna?
I interesuje me da li ce mozda doci do greske u jedno-satnom periodu pre ili posle same promene vremena?

[Ovu poruku je menjao zgas dana 20.09.2007. u 12:19 GMT+1]
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.ADSL.neobee.net.



+2 Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...20.09.2007. u 11:48 - pre 201 meseci
Pozd.

Ovo je pogreshno. PHP upravo i ima funkcije za rachunanje vremena da ti ne bi morao da izmishljash toplu vodu.

Prvo da se razumemo, vreme je konstanta, i unix timestamp koji i PHP koristi uvek predstavlja broj sekundi koji je do sada proshao po UTC vremenu. Apsolutno je nebitno shto se jedan isti trenutak u vremenu u australiji smatra za 7 sati ujutru, a u americi 7 sati uveche.

Ti ako zhelish da izrachunash koliko ce proteci realno sekundi, dovoljno je rachunati po UTC vremenu jer je toliko vremena zaista proshlo. To ako se u medjuvremenu desi da se sat pomerio napred ili nazad, nevazhno je. Ako je sada 01:59:59 a sledece sekunde 03:00:00, jel to znachi da je proshlo sat vremena ili jedna sekunda? Analogno, ako je sada 02:59:59 i sledece sekunde je 02:00:00, jel to znachi da je proshlo minus sat vremena ili jedna sekunda? Znachi realno do dogadjaja je ostalo tachno toliko sekundi, a to shto sad tebi u Beogradu pishe da je to 3 ujutru a meni u americi 8 uveche je totalno nebitna stvar, i meni u USA i tebi u Beogradu je ostao isti broj sekundi do dogadjaja - ako uzmesh sat pa mu pomerash kazaljke unapred, ocesh moci odma da pogledash emisiju na TV-u koja pochinje za 3 sata? :)

Funkcija date() ce ti ispisati vreme u aktuelnoj chasovnoj zoni, koje god to bilo, a do korisnika je da zna kada je to (ti cesh mu pomoci time shto cesh mu reci da je to za toliko i toliko sekundi/minuta/dana). Jedina stvar koja tu mozhe da zbuni, jeste kada se sat vraca unazad. Tada, u toj chasovnoj zoni, imash dva razlichita trenutka u vremenu koje imaju identichno lokalno vreme, pa iskaz da se dogadjaj deshava tog i tog dana u 02:30:00 mozhe da znachi i da se deshava i sat vremena kasnije kada je u toj zoni opet 02:30:00. No, realan broj sekundi do deshavanja tog dogadjaja je nepromenljiv.

Svako dobro.
 
Odgovor na temu

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
*.dynamic.sbb.co.yu.



+19 Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...20.09.2007. u 12:54 - pre 201 meseci
UTC je linearno vreme i to je ono što mislim da tebi treba.
Ko što stsung reče, nebitno je što se ljudi u nekoj zemlji dogovore da će za par dana pomeriti sat u nazad, vreme i dalje teče.

Funkcija time() ti daje baš to, UTC vreme.
Jedino što ona ne uzima u obzir su pretupne sekunde (http://en.wikipedia.org/wiki/Leap_second) ali nadam se da nemaš potrebe za tolikom preciznošću.
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.yu.

Sajt: odbrojavanje.com


Profil

icon Re: sabiranje datuma na prelazu letnje - zimsko vreme...20.09.2007. u 15:54 - pre 201 meseci
Da, potpuno sam pogresno postavio stavri u prethodnoj poruci.
Sve me je narocito zbunilo kada sam video da ljudi prave posebne klase za rad sa datumima, pa sam mislio da je potrebna narocita akrobacija jer PHP ne moze sam sa svojim funkcijama. Moja je pretpostavka bila da i ono sto PHP moze, mora da se doradi...

Konacno sam dosao sebi i video da mi time() datum resava sve probleme kalkulacija bez potrebe za komplikovanjima sa DST vremenom...

Korisnik treba da mi vidi preostalo vreme, sto se resava jednostavnim oduzimanjem unix datuma, i treba da mi vidi njegovo trenutno vreme kao i vreme kada nastupa dogadjaj u buducnosti (isto po njegovom vremenu). To resavam tako sto unix time dogadjaj metnem u date() funkciju i to je to.

Hvala puno na trudu sto ste mi pomogli da shvatim rad sa datumima, posebno tebi 'stsung'.
Jos samo da shvatim cemu onolike klase za rad sa datumima!?
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

[es] :: PHP :: sabiranje datuma na prelazu letnje - zimsko vreme...

[ Pregleda: 4976 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.