[ Ivan Miladinović @ 30.11.2006. 17:43 ] @
Pozdrav,

pravim plan za rad na jednoj PHP aplikaciji u sustini mi je najvaznija u glavnom delu DATE funkcija tj. "rad sa datumima".

Ukratko dacu primere za sta bi mi trebala funkcija i koji format datuma preporucujete:

Primer 1:
zadat je datum 11.05.2006.
ja hocu da jednostavno iz padajuceg menija izaberem recimo 3 meseca trajanje ili 2 nedelje trajanje ili 10 dana trajanje...

Moze i gotova funkcija a moze i pomoc kako sracunati? Kako da ja izracunam kada ce biti tih dana... Ili kako da sracunam ako ja unesem recimo 3 meseca i 5 dana? Kako ce PHP znati da ja hocu da on upise u bazu recimo 16.08.2006.?

Sad ce neko kaze pa pisi funkciju :) Pa hocu da pisem funkciju - samo mi malo pomozite da se pokrenem.

Primer 2:
zadat je datum negde u bazi recimo 12.06.2006.
danas je 30.11.2006.

Kako da napisem funkciju koja ce da kaze ako vidi takav red u bazi recimo (dokument je nevazeci, stariji je od 6 meseci).

Bitno mi je RACUNANJE.

Zakljucak
Hocu da naucim kako se radi sa datumima...
Kako to radite?
Koji format za datum preporucujete? (meni bi recimo odgovarao 20.12.2006. tako neki format... Jel' se preporucuje?)
Ima li PHP unapred ugradjene funkcije koje automatski razgradjuju takve stvari (ja nisam uspeo da nadjem).

Naravno citao sam http://www.php.net/date ali mi treba neki hint od nekoga ko je radio i ko koristi datume cesto.

Znaci ponavljam moze i gotovo resenje a mogu i samo hintovi kako doci do funkcije, znaci mozak mi je stopiran. Poludecu ako ovo ne resim. Kao da imam blokadu. :(

Ova funkcija mi je zapala za oko:
Code:
<?php
   function ezDate($d) {
       $ts = time() - strtotime(str_replace("-","/",$d));
      
       if($ts>31536000) $val = round($ts/31536000,0).' year';
       else if($ts>2419200) $val = round($ts/2419200,0).' month';
       else if($ts>604800) $val = round($ts/604800,0).' week';
       else if($ts>86400) $val = round($ts/86400,0).' day';
       else if($ts>3600) $val = round($ts/3600,0).' hour';
       else if($ts>60) $val = round($ts/60,0).' minute';
       else $val = $ts.' second';
      
       if($val>1) $val .= 's';
       return $val;
   }
?>

Then I use it as follows;

<?php
   echo ucwords(ezDate('2006-09-07 18:42:00')).' Ago';
?>



Da li bi ste je koristili?


Puno pozdrava svima i unapred hvala na savetima.
[ Nemanja Avramović @ 30.11.2006. 18:13 ] @
Sa time() dobijaš timestamp trenutnog vremena. Sa date() formatiraš timestamp da bude čitljiv ljudima a sa mktime() datum čitljiv ljudima prebacuješ u timestamp. Kad imaš timestamp onda je računanje lako (to je broj sekundi od 01.01.1970... ja mislim... uostalom nije ni bitno od kad je )
[ Mr. Jack @ 30.11.2006. 18:33 ] @
> Kako da napisem funkciju koja ce da kaze ako vidi takav red u bazi
> recimo (dokument je nevazeci, stariji je od 6 meseci).

MySQL ima lepu funkciju koja se zove DATEDIFF.
[ Ivan Miladinović @ 30.11.2006. 20:48 ] @
Nasao sam jos nesto zanimljivo mislim da je ovo osnova koju sam trazio kao i ovo sto je Nemanja spomenuo i objasnio u jednoj recenici. Bas to mi je trebalo.
Ovo ispod je u sustini osnova koja mi je trebala i na sta sam mislio, dalja racunanja cu sam da radim kao i da pisem potrebne funkcije. :)

Code:

$nextWeek = time() + (7 * 24 * 60 * 60);
// 7 days; 24 hours; 60 mins; 60secs
echo 'Now:      '. date('Y-m-d') ."\n";
echo 'Next Week: '. date('Y-m-d', $nextWeek) ."\n";


Naravno pre nego pocnem da pisem aplikaciju pogledacu i DATEDIFF pa cu videti sta mi vise odgovara.

Hvala.
[ Miroslav Ćurčić @ 01.12.2006. 19:49 ] @
Treba obratiti pažnju na to da je timestamp broj sekundi od 1970 ali po griniču (GMT) tako da kad (ovde u Srbiji) radiš svoju kalklaciju vremena možeš dobiti čudne rezultate, recimo kad probaš da odsečeš vreme iz datuma sa floor(time()/86400)*86400 , i kad to prikažeš sa funkcijom date dobiješ da je 01:00 a ne ponoć, isto tako sa mktime(0, 0, 0, 1, 1, 1970) umesto nule dobiješ grešku zbog negativanog broja (minus jedan sat).

Funkcija date uzima u obzir vremensku zonu i dodaje na timestamp da i prikazao tačno vreme, a mktime pomera vreme u drugu stranu.

Ne znam gde tu uskače pomeraj za letnje/zimsko (daylight) računanje vremena.
[ Miroslav Ćurčić @ 01.12.2006. 22:10 ] @
Takođe, nema svaki dan u godini tačno 24 časa (86400 sekundi).
Dvaput godišnje će se desiti da takva ("Next week") računica neće biti ispravna.
U nekim situacijama to i nije toliko bitno ali ponekad i jeste.

Rešenje bi ovde bilo:
Code:

  $T= explode('.', gmdate('H.i.d.m.Y'));
  $NextWeek= gmmktime($T[0], $T[i], 0, $T[3], $T[2]+7, $T[4]);
[ Ivan Miladinović @ 08.12.2006. 18:09 ] @
Hvala mVeliki.

U mom slucaju (trenutno) nije vazna toliko racunica da li je par sati +/-. Vazan mi je dan.
Sto se tice daylight necu oko toga da se opterecujem jer mi trenutno nije ni najmanje bitno.

Naravno koristicu precizniju racunicu koju si predlozio, zbog sebe, da bi mi preslo u naviku kad pisem programe, ali ovom prilikom niti umem niti je neophodno da se zadrzavam oko daylight prelaza.

Hvala jos jednom na informaciji i pomoci, iskreno nisam ni znao da nema svaki dan tacno 86400 sekundi (svaki da covek nauci po nesto novo).

Pozdrav
Ivan
[ Miroslav Ćurčić @ 09.12.2006. 21:50 ] @
Ako slučajno niste znali, postoje i prestupne sekunde !

http://en.wikipedia.org/wiki/Leap_second

Više se ni u vreme ne možeš pouzdati :-)