OPPITUNTI15 Päivämäärien käsittely

Samankaltaiset tiedostot
OPPITUNTI 5 Ohjelman kulku

OPPITUNTI 3 Ensimmäinen skripti

OPPITUNTI 11 DBM-funktioiden käyttö

7. Taulukot 105. Kuinka taulukoiden tietoa käsitellään ja lajitellaan

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

8. Oliot 123. Kuinka luokkia luodaan ja olioita saadaan aikaan. Kuinka luodaan ja käsitellään ominaisuuksia ja metodeja

Rakenteiset tietotyypit Moniulotteiset taulukot

OPPITUNTI 20 Tilan tallentaminen istuntofunktioilla

OPPITUNTI 10 Tiedostojen käsittely

Harjoitus 2 (viikko 45)

May 24 to May 30, 2010

Harjoitustyö: virtuaalikone

OPPITUNTI 16 Tiedon käsittely

Ohjelmoinnin perusteet Y Python

Week

Ohjelmoinnin perusteet Y Python

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

OPPITUNTI 24 Esimerkki (Osa 2)

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

Java-kielen perusteet

Week

Ohjelmoinnin peruskurssi Y1

Toiminnallinen määrittely versio 1.2

Ohjelmoinnin peruskurssi Y1

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

St. Teresa Benedicta of the Cross Schedule Basic Listing

Ohjelmoinnin perusteet Y Python

January 31 to February 6, 2011

Sonera Viestintäpalvelu VIP VIP Laajennettu raportointi Ohje

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Cal. 6A32 KÄYTTÖOHJE

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

Ohjelmoinnin peruskurssi Y1

MAINOSTILA MAINOSTILA MAINOSTILA. Maisema Luonto 2011 MAINOSTILA. Koko: 300 x 400 mm. + mainostila

ICT1TN004. Lomakkeet. Heikki Hietala

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Python-ohjelmointi Harjoitus 2

Lomake kannattaa asemoida taulukkoon: table. Silloin selitteet ja kentät saadaan sarakkeisiin. Kenttien ulkoasu voidaan määritellä tyyleillä.

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

OPPITUNTI 12 MySQL-tietokannan käyttö

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

SELECT-lauseen perusmuoto

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

OPPITUNTI 17 Merkkijonoilla työskentely

VINKKEJÄ CV-NETIN KÄYTTÖÖN.

Verkkojulkaiseminen Minna Väisänen. HTML5-tehtävä

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Ohjelmoinnin perusteet Y Python

JYVÄSKYLÄN SEUDUN. 1. Sisältö * * Tähdellä merkityt kohdat ovat pakollisia. Sivun oikeassa yläkulmasta löytyy Lisää oma tapahtumasi.

OPPITUNTI 14 Dynaamisten kuvien käsittely

Palvelinpuolen ohjelmointi

OSA III PHP:n käyttö. Oppitunti

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin perusteet Y Python

Tee html-sivu, jossa on yllä olevat kaksi taulukkoa.

Google-dokumentit. Opetusteknologiakeskus Mediamylly

11. Javan toistorakenteet 11.1

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

2 Konekieli, aliohjelmat, keskeytykset

TIEDONHALLINTA - SYKSY Luento 8. Saapumisryhmä: Pasi Ranne /9/13 Helsinki Metropolia University of Applied Sciences

OPPITUNTI 21 Palvelinympäristö

Ohjelmoinnin peruskurssi Y1

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Oppilaan opas. Visuaaliviestinnän Instituutti VVI Oy. Versio 0.2 ( )

Makrojen mystinen maailma lyhyt oppimäärä

Algoritmit 1. Demot Timo Männikkö

Python-ohjelmointi Harjoitus 5

7. Näytölle tulostaminen 7.1

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Steven juhlavuosi 2008

Helsingin yliopisto WebOodi 1 Opiskelijarekisteri Versio 3.2. Tenttityökalu

OSA II Kieli. Oppitunti. 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

VINKKEJÄ CV-NETIN KÄYTTÖÖN.

Ohjelmoinnin perusteet Y Python

TAULUKON TEKEMINEN. Sisällysluettelo

Ohjelmoinnin perusteet Y Python

MAINOSTILA MAINOSTILA MAINOSTILA. Maisema Luonto 2012 MAINOSTILA. Koko: 290 x 400 mm + mainostila

Ohjelmoinnin peruskurssi Y1

Backup Premium Pikakäyttöopas

Sähköpostitilin käyttöönotto

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

ITKP102 Ohjelmointi 1 (6 op)

12. Javan toistorakenteet 12.1

Java-kielen perusteita

Kun valitset Raportit, Lisää uusi, voit ryhtyä rakentamaan uutta raporttia alusta alkaen itse.

Java-kielen perusteita

12. Javan toistorakenteet 12.1

Kun tulostuksessa ilmenee muotoiluvirheitä

Transkriptio:

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