15. Päivämäärien käsittely 269 OPPITUNTI15 Päivämäärien käsittely Päivämäärät kuuluvat niin usein jokapäiväiseen elämään, että niiden käsittely on rutiininomaista. Kalenterin käsittely ei aina ole kuitenkaan niin helppoa ohjelmallisesti. Onneksi PHP tarjoaa käyttöön voimallisia työkaluja päivämääräaritmetiikkaan ja päivämäärien käsittelyyn. Tämän luvun aiheita ovat seuraavat: Kuinka ottaa esille nykyinen päivämäärä ja kellonaika Kuinka saada tietoa päivämäärästä Kuinka muotoillaan päivämääräinformaatiota Kuinka testata päivämäärien oikeellisuus Kuinka asettaa päivämääriä Kuinka muodostaa yksinkertainen kalenteriskripti
270 15. Päivämäärien käsittely Päivämäärän sieppaaminen time()-funktiolla PHP:n time()-funktio antaa kaiken tarvittavan informaation nykyisestä päivämäärästä ja ajasta. Se ei vaadi lainkaan argumentteja, mutta palauttaa kokonaisluvun. Tuo lukuarvo on hieman vaikeaselkoinen, mutta kuitenkin hyvin hyödyllinen. print time(); // näytetulostus: 948316201 Funktion palauttama kokonaisluku edustaa sekuntien määrää, joka on kulunut keskiyöstä 1.1.1970 GMTaikaa. Tuo hetki tunnetaan UNIX-aikana ja kulunutta sekuntimäärää kutsutaan aikaleimaksi. PHP tarjoaa käyttöön erinomaisia työkaluja aikaleiman muuntamiseen ihmisille sopivampaan muotoon. Aikaleimamuoto on kuitenkin kaikkein turhin tapa tallentaa päivämäärä, eikö totta? Itse asiassa asia on päinvastoin. Juuri tuosta yhdestä ainoasta lukuarvosta saadaan irti monenlaista informaatiota. Ja kaiken lisäksi tuon lukuarvon ansiosta päivämäärä- ja aika-aritmetiikka on yksinkertaista. Pohdipa kotitekoista päivämääräjärjestelmää, johon pitää kirjaa kuukauden päivistä, kuukausista ja vuosista. Kuvittele nyt skriptiä, jonka tulee lisätä yksi päivä annettuun päivämäärään. Jos tuo päivämäärä sattuisi olemaan 31. joulukuuta 1999, vaikuttaisi päivän lisääminen myös kuukauden ja vuosiluvun muuttumiseen (tulos olisi siis 1. tammikuuta 2000). Aikaleiman avulla voidaan lisäämisessä käyttää päivää vastaavaa sekuntilukua ja siinä kaikki. Voit sitten muuntaa tuon luvun johonkin muuhun, havainnollisempaan muotoon. Aikaleiman muuntaminen getdate()-funktiolla Nyt kun käytössäsi on aikaleima, sinun on osattava muuntaa se ennen päivämäärän esittämistä käyttäjälle. Se tapahtuu getdate()-funktiolla. Funktio ottaa argumentikseen aikaleiman ja palauttaa assosiatiivisen taulukon, jossa päivämäärätieto on. Jos jätät pois aikaleiman kutsun yhteydessä, funktio käyttää nykyistä aikaleimaa, jonka funktion time() palauttaa. Taulukko 15.1 luettelee getdate()-funktion palauttaman taulukon elementtien merkityksen. Taulukko 15.1 getdate()-funktion palauttaman taulukon elementit. Avain Selitys Esimerkki seconds Yli minuutin menevät sekunnit (0 59) 28 minutes Yli tunnin menevät minuutit (0 59) 7 hours Päivän tunnit (0 23) 12 mday Kuukauden päivä (1 31) 20 wday Viikonpäivän numero (0 6) 4 mon Kuukauden numero (1 12) 1 year Vuosi (4 numeroa) 2000 yday Vuoden päivä (0 365) 19 weekday Viikonpäivän nimi Thursday month Kuukauden nimi January 0 Aikaleima 948370048 Listaus 15.1 käyttää getdate()-funktiota aikaleimatiedon jäsentelyyn; siinä oleva foreach-lause tulostaa jokaisen elementin. Tyypillinen tulostus esitetään kuvassa 15.1. Funktio palauttaa päivämäärän suhteessa paikalliseen aikavyöhykkeeseen.
15. Päivämäärien käsittely 271 Listaus 15.1 Päivämäärän selvittäminen getdate()-funktiolla 1: <html> 2: <head> 3: <title>listing 15.1 Acquiring date information with getdate()</title> 4: </head> 5: <body> 6: <?php 7: $date_array = getdate(); // ei argumenttia, joten käyt. nyk. päivämäärää 8: foreach ( $date_array as $key => $val ) 9: { 10: print "$key = $val<br>"; 11: } 12:?> 13: <hr> 14: <? 15: print "Today's date: $date_array[mday]/$date_array[mon]/ $date_array[year]<p>"; 16:?> 17: </body> 18: </html> KUVA 15.1 Funktion getdate() käyttö. Aikaleiman muuntaminen date()-funktiolla Voit käyttää getdate()-funktiota halutessasi käsitellä funktion tuottamia elementtejä. Joskus saatat kuitenkin haluta vain esittää päivämäärän merkkijonona. Funktio date() palauttaa muotoillun merkkijonon, joka esittää päivämäärätiedot. Voit tehdä kokeiluja funktiolla ja saatkin pian nähdä, kuinka monipuolisesti funktion tuottamaa tulosta voidaan muotoilla; muotoilutapa annetaan funktion argumenttina.
272 15. Päivämäärien käsittely Muotoilumerkkijonon lisäksi date() ottaa valinnaiseksi argumentikseen aikaleiman. Taulukko 15.2 luettelee muotoilumerkkijonon mahdolliset koodit. Kaikki muu muotoilumerkkijonossa oleva tieto laitetaan mukaan palautusarvoon. Taulukko 15.2 Muotoilukoodit, jotka date()-funktio hyväksyy Muotoilukoodi Selitys Esimerkki a am tai pm pm A AM tai PM PM d Kuukauden päivä (lukuarvo etunollalla) 20 D Viikonpäivä (kolme kirjainta) Thu F Kuukauden nimi January h Tunti (12 tunnin muoto, etunollat mukana) 12 H Tunti (24 tunnin muoto, etunollat mukana) 12 g Tunti (12 tunnin muoto, ei etunollia mukana) 12 G Tunti (24 tunnin muoto, ei etunollia mukana) 12 i Minuutit 47 j Kuukauden päivä (ei etunollia) 20 I Viikonpäivän nimi Thursday L Karkausvuosi ( 1 on kyllä, 0 on ei) 1 m Vuoden kuukausi (numero, etunollat mukana) 01 M Vuoden kuukausi (nimi, 3 kirjainta) Jan n Vuoden kuukausi (numero, ei etunollia) 1 s Tunnin sekunnit 24 U Aikaleima 948372444 y Vuosi (2 numeroa) 00 Y Vuosi (4 numeroa) 2000 z Vuoden päivä (0 365) 19 Z Siirtymä sekunneissa GMT:stä 0 Listaus 15.2 käyttää muutamaa muotoilutapaa. Listaus 15.2 Päivämäärän muotoileminen date()-funktiolla 1: <html> 2: <head> 3: <title>listing 15.2 Formatting a date with date()</title> 4: </head> 5: <body> 6: <?php 7: print date("m/d/y G.i:s<br>", time()); 8: // 01/20/00 13.27:55 9: print "Today is "; 10: print date("j of F Y, \a\\t g.i a", time()); 11: // Tulostaa: "Today is 20 of January 2000, at 1.27 pm" 12:?>
15. Päivämäärien käsittely 273 13: </body> 14: </html> Vaikka muotoilumerkkijono näyttääkin oudolta, se on helppo muodostaa. Jos haluat lisätä merkkijonon muotoiluun, jossa on muotoilukoodeina toimivia kirjaimia, voit eliminoida niiden merkityksen asettamalla kenoviivan (\) niiden eteen. Jos käytät escape-merkkejä sellaisten ohjausmerkkien (esimerkiksi n ja \n) yhteydessä, sinun on laitettava eteen vielä toinen escape-merkki, joka eliminoi ensimmäisen escape-merkin. Niinpä merkkiyhdistelmän \n (ohjausmerkkinä rivinvaihto) eteen tulee laittaa toinen kenoviiva (\\n). Funktio palauttaa päivämäärätiedot paikallisen aikavyöhykkeen mukaan. Jos haluat muotoilla päivämäärän GMT:n mukaan, sinun tulee käyttää gmdate()-funktiota, joka toimii täysin samalla lailla. Aikaleiman luominen mktime()-funktiolla Osaat jo siepata nykyisen ajan, mutta et osaa vielä käsitellä erillisiä aikoja. Funktio mktime() palauttaa aikaleiman, jota voit käyttää date()- ja getdate()-funktioiden kanssa. Funktio ottaa argumenteikseen kuusi kokonaislukua, jotka annetaan seuraavassa järjestyksessä: tunti, minuutti, sekunti, kuukausi, kuukaudenpäivä, vuosi. Listaus 15.3 käyttää mktime()-funktiota aikaleiman saamiseen; aikaleimaa käytetään sitten date()-funktion toimesta. Listaus 15.3 Aikaleiman luominen mktime()-funktiolla 1: <html> 2: <head> 3: <title>listing 15.3 Creating a timestamp with mktime()</title> 4: </head> 5: <body> 6: <?php 7: // tee aikaleima ajalle "1/5/99 at 2.30 am" 8: $ts = mktime( 2, 30, 0, 5, 1, 1999 ); 9: print date("m/d/y G.i:s<br>", $ts); 10: // 05/01/99 2.30:00 11: print "The date is "; 12: print date("j of F Y, \a\\t g.i a", $ts ); 13: // Tulostaa: "The date is 1 of May 1999, at 2.30 am" 14:?> 15: </body> 16: </html>
274 15. Päivämäärien käsittely Voit halutessasi jättää pois jotkin tai vaikka kaikki argumentit mktime()-funktion yhteydessä; tällöin funktio käyttää nykyistä aikaa oletuksena. Funktio myös säätää arvot, jotka eivät satu sopivalle arvoalueelle, joten esimerkiksi tuntina annettu arvo 25 muunnetaan muotoon 1.00am eli funktio osaa siirtyä seuraavaan päivään. Päivämäärän testaaminen checkdate()-funktiolla Sinun on voitava myös ottaa vastaan käyttäjän syöttämä aikatieto. Ennen kuin alat käsitellä tuota päivämäärää tai tallennat sen tietokantaan, sinun kannattaa tarkistaa, että päivämäärä on sopiva. Funktio checkdate() ottaa kolme kokonaislukuargumenttia: kuukauden, päivän ja vuoden. Se palauttaa arvon true, jos kuukausi on väliltä 1-12, päivä on sopiva kyseisen kuukauden ja vuoden päiväksi (ottaen huomioon karkausvuodet) ja vuosi on väliltä 0-32767. Ole kuitenkin varovainen, sillä päivämäärä saattaa näyttää oikealta, mutta muut päivämääräfunktiot eivät hyväksy sitä. Esimerkiksi seuraava koodi palauttaa arvon true: checkdate( 4, 4, 1066 ) Jos yrittäisit muodostaa päivämäärän noilla arvoilla mktime()-funktion avulla, olisi tuloksena aikaleima -1. Peukalosääntönä voisi sanoa, että mktime()-funktiota ei pitäisi käyttää vuosiluvuille, jotka ovat pienempiä kuin1902; Esimerkki Tuokaamme nyt useimmat näistä funktioista yhteen ja muodostakaamme esimerkki. Aiomme nyt kehittää kalenterin, joka osaa esittää kaikkien kuukausien päivämäärät väliltä 1980-2010. Käyttäjän tulee voida valita sekä kuukausi että vuosi alasvetovalikoista ja päivämäärien tulee olla järjestettyinä viikon päivien mukaan. Käytämme ohjelmassa apunamme kahta globaalia muuttujaa, $month ja $year, joihin käyttäjä saa antaa tietonsa. Muodostamme niillä aikaleiman, joka perustuu annetun kuukauden ensimmäiseen päivään. Jos syöttötieto on sopimaton tai sitä ei ole, laitetaan oletusajaksi nykyisen kuukauden ensimmäinen päivä. Käyttäjän syöttämän tiedon tarkistaminen Kun käyttäjä tulee sivullemme ensimmäistä kertaa, hän ei lähetä mitään tietoa. Siksi meidän tulee varmistaa, että skriptimme osaa käsitellä tilannetta, jossa muuttujia $month ja $year ei ole määritelty. Voisimme käyttää siihen isset()-funktiota. Funktio palauttaa arvon false, jos sille viety muuttuja on määritetty. Otamme kuitenkin käyttöön checkdate()-funktion. Listaus 15.4 sisältää koodin, joka tarkistaa $month- ja $yearmuuttujat ja muodostaa aikaleimat niiden perusteella. Listaus 15.4 Käyttäjän syöttämän tiedon tarkistaminen kalenteriskriptissämme 1: <?php 2: if (! checkdate( $month, 1, $year ) ) 3: { 4: $nowarray = getdate(); 5: $month = $nowarray[mon]; 6: $year = $nowarray[year];
15. Päivämäärien käsittely 275 7: } 8: $start = mktime ( 0, 0, 0, $month, 1, $year ); 9: $firstdayarray = getdate($start); 10:?> Listaus 15.4 on osa laajempaa skriptiä, joten se ei tuota mitään tulostusta. Koodin if-lauseessa oleva checkdate() palauttaa arvon false, koska nyt kuukautta ja vuotta ei ole määritetty, joten ei voida tuottaa mitään sopivaa päivämäärääkään. Tämä lähestymistapa on hyvä myös siinä mielessä, että se varmistaa, että käyttäjän lähettämät tiedot todellakin muodostavat sopivan päivämäärän. Jos päivämäärä ei ole sopiva, käytämme getdate()-funktiota luomaan assosiatiivisen taulukon nykyisen ajan perusteella. Asetamme sitten arvot $month ja $year itse käyttämällä taulukon mon- ja year-elementtejä. Nyt kun olemme varmoja siitä, että muuttujissa $month ja $year on sopivat päivämäärätiedot, voimme käyttää mktime()-funktiota luomaan aikaleima kuukauden ensimmäiselle päivälle. Tarvitsemme tätä informaatiota myöhemmin, joten luomme muuttujan nimeltä $firstdayarray, joka tallentaa getdate()- funktion palauttaman assosiatiivisen taulukon, joka perustuu tähän aikaleimaan. HTML-lomakkeen luominen Meidän on luotava käyttöliittymä, jota kautta käyttäjät voivat ottaa esille haluamansa kuukauden ja vuoden. Käytämme käyttöliittymässä SELECT-elementtejä. Vaikka käytämmekin raakaa HTML-koodia, meidän on varmistettava, että alasvetovalikkojen sisältönä on alustavasti juuri valittu kuukausi, joten luomme nuo alasvetovalikot dynaamisesti ja lisäämme SELECT-attribuutin OPTION-elementtiin aina tarvittaessa. Lomake generoidaan listauksessa 15.5. Listaus 15.5 HTML-lomake kalenteriskriptiin 1: <?php 2: if (! checkdate( $month, 1, $year ) ) 3: { 4: $nowarray = getdate(); 5: $month = $nowarray[mon]; 6: $year = $nowarray[year]; 7: } 8: $start = mktime ( 0, 0, 0, $month, 1, $year ); 9: $firstdayarray = getdate($start); 10:?> 11: <html> 12: <head> 13: <title><?php print "Calendar: $firstdayarray[month] 14: $firstdayarray[year]"?></title>
276 15. Päivämäärien käsittely 15: <head> 16: <body> 17: <form method="post"> 18: <select name="month"> 19: <?php 20: $months = Array("January", "February", "March", "April", 21: "May", "June", "July", "August", "September", 22: "October", "November", "December"); 23: for ( $x=1; $x <= count( $months ); $x++ ) 24: { 25: print "\t<option value=\"$x\""; 26: print ($x == $month)?" SELECTED":""; 27: print ">".$months[$x-1]."\n"; 28: 29:?> 30: </select> 31: <select name="year"> 32: <?php 33: for ( $x=1980; $x<2010; $x++ ) 34: { 35: print "\t<option"; 36: print ($x == $year)?" SELECTED":""; 37: print ">$x\n"; 38: } 39:?> 40: </select> 41: <input type="submit" value="go!"> 42: </form> 43: </body> 44: </html> Kun olemme luoneet $start-aikaleiman ja $firstdayarray-päivämäärätaulukon, kirjoitamme HTML-koodia sivulle. Huomaa, että käytämme $firstdayarray-taulukkoa kuukauden ja vuoden lisäämiseksi TITLEelementtiin. Edellisissä esimerkeissämme olemme käyttäneet globaalia muuttujaa $PHP_SELF FORM-
15. Päivämäärien käsittely 277 elementissä sen varmistamiseksi, että lomake kutsuu itseään lähettämisen yhteydessä. Skriptissämme olemme käyttäneet hyödyksi sitä seikkaa, että ACTION-argumentin poisjättäminen FORM-tagista saa aikaan sen, että lomake lähetetään oletuksena sivulle, jossa lomake itse on. Alasvetovalikon SELECT-elementti luodaan taas PHP-moodissa, jossa yksittäiset OPTION-tagit kirjoitetaan. Ensin luomme taulukon nimeltä $months, joka sisältää 12 kuukauden nimeä. Sitten käymme taulukon läpi silmukassa ja luomme OPTIONtagin kullekin kuukaudelle. Menettelytapa saattaa näyttää turhan monimutkaiselta, mutta nyt koodi lisäksi tarkistaa, onko muuttujassa $x (for-silmukan laskuri) sama arvo kuin muuttujassa $month; jos näin on, lisätään merkkijono SELECTED OPTION-tagiin, jolloin varmistetaan, että kyseinen kuukausi on automaattisesti valittuna, kun sivu ladataan. Käytämme samanlaista tekniikkaa myös vuosia sisältävän luettelon kirjoittamiseksi. Lopuksi palaamme HTML-moodiin ja luomme submit-painikkeen. Meillä tulisi nyt olla lomake, joka osaa lähettää kuukauden ja vuoden itselleen ja laittaa oletukseksi joko nykyisen kuukauden ja vuoden tai aiemmin valitut arvot. Kuva 15.2 kertoo tilanteen. KUVA 15.2 Kalenterilomake. Kalenteritaulukon luominen Nyt meidän on luotava taulukko ja täytettävä se valitun kuukauden päivämäärillä. Teemme sen listauksessa 15.6, jossa on koko kalenterikoodi. Listaus 15.6 Kokonainen kalenteriskripti 1: <?php 2: define("aday", (60*60*24) ); 3: if (! checkdate( $month, 1, $year ) ) 4: { 5: $nowarray = getdate(); 6: $month = $nowarray[mon]; 7: $year = $nowarray[year]; 8: } 9: $start = mktime ( 0, 0, 0, $month, 1, $year ); 10: $firstdayarray = getdate($start); 11:?> 12: <html>
278 15. Päivämäärien käsittely 13: <head> 14: <title><?php print "Calendar: $firstdayarray[month] 15: $firstdayarray[year]"?></title> 16: <head> 17: <body> 18: <form action="<? print $PHP_SELF?>" method="post"> 19: <select name="month"> 20: <?php 21: $months = Array("January", "February", "March", "April", 22: "May", "June", "July", "August", "September", 23: "October", "November", "December"); 24: for ( $x=1; $x <= count( $months ); $x++ ) 25: { 26: print "\t<option value=\"$x\""; 27: print ($x == $month)?" SELECTED":""; 28: print ">".$months[$x-1]."\n"; 29: } 30:?> 31: </select> 32: <select name="year"> 33: <?php 34: for ( $x=1980; $x<2010; $x++ ) 35: { 36: print "\t<option"; 37: print ($x == $year)?" SELECTED":""; 38: print ">$x\n"; 39: } 40:?> 41: </select> 42: <input type="submit" value="go!"> 43: </form> 44: <p> 45: <?php
15. Päivämäärien käsittely 279 46: $days = Array("Sunday", "Monday", "Tuesday", "Wednesday", 47: "Thursday", "Friday", "Saturday"); 48: print "<TABLE BORDER = 1 CELLPADDING=5>\n"; 49: foreach ( $days as $day ) 50: print "\t<td><b>$day</b></td>\n"; 51: for ( $count=0; $count < (6*7); $count++ ) 52: { 53: $dayarray = getdate( $start ); 54: if ( (($count) % 7) == 0 ) 55: { 56: if ( $dayarray[mon]!= $month ) 57: break; 58: print "</tr><tr>\n"; 59: } 60: if ( $count < $firstdayarray[wday] $dayarray[mon]!= $month ) 61: { 62: print "\t<td><br></td>\n"; 63: } 64: else 65: { 66: print "\t<td>$dayarray[mday] $dayarray[month]</td>\n"; 67: $start += ADAY; 68: } 69: } 70: print "</tr></table>"; 71:?> 72: </body> 73: </html> 74:
280 15. Päivämäärien käsittely Koska taulukko on indeksoitu viikonpäivien mukaan, käymme silmukassa läpi päivien nimet sisältävän taulukon ja tulostamme nimet omiin soluihinsa. Skriptin todellinen jekku tapahtuu viimeisessä for-lauseessa. Alustamme muuttujan nimeltä $count ja varmistamme, että silmukka päättyy 42 kierroksen jälkeen. Näin voimme olla varmoja siitä, että luomme tarpeeksi soluja päivämäärätietoja varten. Tuon silmukan sisällä muunnamme $start-muuttujan päivämäärätaulukoksi getdate()-funktiolla. Tulos laitetaan $dayarraytaulukkoon. Vaikka $start onkin kuukauden ensimmäinen päivä silmukan ensimmäisellä kierroksella, kasvatamme aikaleimaa 24 tunnilla jokaisen kierroksen yhteydessä. Testaamme sitten muuttujan $count ja arvon 7 jakojäännöksen. Tähän if-lauseeseen kuuluva koodi ajetaan vain silloin, kun $count on joko 0 tai arvon 7 monikerta. Tällä tavoin saamme selville, onko meidän lopetettava koko silmukka vai aloitettava uusi rivi. Kun olemme saaneet selville, että olemme ensimmäisellä kierroksella tai rivin lopussa, voimme mennä tekemään seuraavan testin. Jos $dayarray-taulukon mon-elementin arvo ei ole enää sama kuin $monthmuuttujan arvo, olemme lopettaneet. Muista, että $dayarray sisältää tietoa $start-aikaleimasta, jossa vuorostaan on nykyinen esitettävä kuukausi. Kun $start on jokin muu kuin nykyinen kuukausi, $dayarray[mon] sisältää jonkin muun arvon kuin sen, jonka käyttäjä sijoitti muuttujaan $month. Jakojäännöstestimme kertoo, milloin olemme rivin lopussa, ja koska kyseessä on uusi kuukausi, tiedämme, että koko silmukka tulee lopettaa. Jos olemme kuitenkin edelleen samassa kuukaudessa, jota tulostetaan, lopetamme vain rivin ja aloitamme uuden rivin. Seuraavassa if-lauseessa päätämme, kirjoitetaanko päivämäärätietoa soluun. Jokainen kuukausi ei ala Sunday-päivällä, joten on todennäköistä, että alussa on pari tyhjää solua. Vain harvat kuukaudet päättyvät jonkin rivin loppuun, joten joudumme todennäköisesti kirjoittamaan muutaman tyhjän solun ennen taulukon lopettamista. Olemme tallentaneet kuukauden ensimmäisen päivän tiedot $firstdayarray-taulukkoon. Nyt voimme erityisesti ottaa esille viikonpäivän numeron, joka on kohdassa $firstdayarray[wday]. Jos $count on pienempi kuin tuo numero, tiedämme, että emme ole vielä kohdanneet oikeaa solua kirjoittamista varten. Samalla lailla, jos $month-muuttuja ei enää ole sama kuin $dayarray[mon], tiedämme, että olemme kohdanneet kuukauden lopun (mutta emme rivin loppua, kuten päättelimme aiemmassa jakojäännöstestissämme). Kummassakin tapauksessa kirjoitamme tyhjän solun selaimelle. Viimeisessä else-lauseessa voimme sitten nautiskella. Olemme jo varmistaneet, että olemme oikean kuukauden sisällä ja että nykyinen päiväsarake vastaa päivää, joka on tallennettu kohtaan $firstdayarray[wday]. Nyt meidän tulee käyttää assosiatiivista $dayarray-taulukkoamme, jota olemme käyttäneet aiemmin silmukassa kirjoittamaan päivä ja kuukauden nimi soluun. Lopuksi meidän tulee kasvattaa $start-muuttujaa, joka sisältää aikaleiman. Me vain lisäämme siihen päivässä olevien sekuntien määrän (olemme määrittäneet tuon arvon skriptin alussa) ja olemme valmiita aloittamaan silmukan uudelleen käyttämällä $start-muuttujassa olevaa uutta arvoa testissämme. Skriptin tuottama tulostus on kuvassa 15.3. KUVA 15.3 Kalenteriskripti.
15. Päivämäärien käsittely 281 Yhteenveto Tällä tunnilla opetimme sinua käyttämään time()-funktiota nykyisen päivämäärän ja ajan sieppaamiseen. Opit myös käyttämään getdate()-funktiota päivämäärätiedon erottamiseen aikaleimasta sekä date()- funktiota muuntamaan aikaleima muotoilluksi merkkijonoksi. Opit myös luomaan aikaleiman mktime()- funktiolla. Lisäksi sait tietää, kuinka päivämäärä testataan checkdate()-funktiolla. Lopuksi kävit läpi esimerkkiskriptin, joka soveltaa joitakin niistä työkaluista, joita olet käyttänyt. K&V K Onko saatavilla funktioita, joilla voidaan muuntaa kalentereita? V Kyllä. PHP tarjoaa käyttöön koko joukon funktioita, jotka kattavat vaihtoehtoiset kalenterit. Voit tutkia niitä PHP:n virallisesta manuaalista, joka on osoitteessa http://www.php.net/manual/ ref.calendar.php. Työpaja Työpaja tarjoaa pikakysymyksiä, joiden avulla voit kerrata läpikäytyä materiaalia. Yritä ymmärtää vastaukset ennen kuin jatkat seuraavaan lukuun. Vastaukset annetaan liitteessä A. Kysymyksiä 1. Kuinka saat esille UNIX:in aikaleiman, joka edustaa nykyistä päivämäärää ja aikaa? 2. Mikä funktio hyväksyy aikaleiman ja palauttaa assosiatiivisen taulukon, joka edustaa annettua päivämäärää? 3. Millä funktiolla voit muotoilla aikatietoa? 4. Kuinka saat otettua minkä tahansa ajankohdan aikaleiman? 5. Millä funktiolla voit tarkistaa, että päivämäärä on kelvollinen? Toiminta 1. Luo syntymäpäivän laskentaskripti. Kun lomakkeen kautta annetaan kuukausi, päivä ja vuosi, ohjelma tulostaa viestin, jossa kerrotaan, kuinka paljon syntymäpäivään on aikaa; aika annetaan päivinä, tunteina, minuutteina ja sekunteina.
282 15. Päivämäärien käsittely