Olen tekemässä aprillipilaa kotisivuilleni ja aikani pähkäillessäni päätin kysyä täältä neuvoa.
Onko helppoa konstia saada aloitusaika 00:00:01 1.4.11 ja lopetus aika 23:59:59 1.4.11 joita vertaisin time() funtiolla saatuun aikaan? En viitsisi laskea käsin koska virheen mahdollisuus kasvaa. Tämä olisi tarkoitus koodata PHP:llä.
Tuona aikana näytetään aprillipilasivu.
Voiko mktime() ja time() saatuja lukuja verrata keskenään ilman muutoksia?
Voi.
Vaikka ihan tarkkaan en tiedä sovellustasi, niin joissakin tilanteissa, joissa ei välttämättä tarvita tunteja ja sitä pienempiä yksiköitä, voisi olla loogisempaa käyttää esim date-funktiota tyyliin:
tai tarkemmin näin:
Täh? Nyt tipahdin kärryiltä.
peg kirjoitti:
tai tarkemmin näin:
Onko tämän tarkoitus olla ajatuksia herättävän huono neuvo?
Eihän tuo ehto toteudu koskaan. Makumakun versiossa ei ollut mitään vikaa, joten miksi tällainen aivokuollut vaihtoehto?
Kun kyse on ajasta, on hyvä muistaa, että maailman eri paikoissa on eri aika ja myös päivä vaihtuu eri aikaan. PHP:n time-funktio antaa palvelimen ajan, joka voi olla ihan eri aika kuin se, missä käyttäjä elää. Hupisovelluksessa tämä ei ehkä ole olennaista, mutta aprillaus olisi kai kuitenkin parempi tehdä silloin, kun käyttäjä elää huhtikuun 1. päivää – siis selaimessa toimivalla koodilla.
Yksinkertaisin ratkaisu on kai se, että selaimessa toimivalla Javascriptillä generoidaan aprillauselementit, jos selaimen kellon mukaan on 1.4.
Yucca kirjoitti:
PHP:n time-funktio antaa palvelimen ajan, joka voi olla ihan eri aika kuin se, missä käyttäjä elää.
Väärin. PHP:n time-funktion tuottama aikaleima ei riipu aikavyöhykkeestä. Palvelimen vyöhykevalinta sen sijaan vaikuttaa mm. date-funktion tuottamaan tekstimuotoiseen päivämäärään. Ennen mitään päivämäärien käsittelyä kannattaakin asettaa PHP:n asetuksiin oikea aikavyöhyke joko asetustiedoston kautta tai funktiolla date_default_timezone_set.
Joo kirjoitin time-funktiosta kun piti kirjoittaa date-funktiosta (joka on tässä luonnollisempi kuten on mainittu). Joka tapauksessa käytettiinpä GMT-, UTC- tai paikallisaikaa, saadaan jotakin, jonka suhde käyttäjän aikaan on tuntematon.
Pointtini oli, että käyttäjän ajasta riippuvaiset asiat pitäisi tehdä selainpäässä eikä palvelinpäässä.
Kysymys herätti näköjään kommentointi rimpsun joten laitan oman versioni.
Tämä tuntuu toimivan lyhyellä aikavälillä, en tiedä sitten kun mennään vuorokausiin.
Tuo vaikuttaisi mielestäni ihan kunnolliselta. En näe tosin mitään estettä vuorokausienkaan kanssa.
novari kirjoitti:
Kysymys herätti näköjään kommentointi rimpsun joten laitan oman versioni.
Tämä tuntuu toimivan lyhyellä aikavälillä, en tiedä sitten kun mennään vuorokausiin.
Lopetuspäivässä on virhe. Oikea lopetusaika pitäisi olla $lopetus=mktime(0,0,0,4,2,2011,1), mikäli halutaan pitää tuo ehtolauseen vertailu tuollaisena.
Tai sitten ehtolauseen lopetuspäivän ehtoon pitäisi lisätä toteutuvaksi myös silloin, kun aika on yhtäsuuri kuin lopetusaika.
Kyse on tosin vain sekunnista, mutta silti...
Ai.... Meinaatko ettei ohjelma lopeta keskiyöllä toimintaansa?
Eihän tuo alkukaan ollut mktime(0,0,0,4,1,2011,1);
Miksi siis tuollain, jotenkin sattuu silmään paremmin kun on yksi sekuntti yli ja ali. En tiedä onko se huonoa ohjelmointia mutta ajatuksena oli ettei siinä kukaan paljoa menetä.
Niin, jokainen varmaan ymmärtää ettei tässä kyseisessä sovellutuksessa asialla ole mitään merkitystä. Ihan yhtä hyvin aprillipilan näyttö voisi loppua vaikka jo 15 sekuntia ennen vuorokauden vaihdetta. Asia on siis periaatteellinen.
Olisi hyvä oppia ohjelmoimaan ja tekemään tarkistukset periaatteellisella tasolla oikein. Jos sama bugi olisi ollut esim jossain pankkiohjelmassa, niin asia saattaisi olla hyvinkin vakava. Kyse ei ole siitä mikä näyttää silmään hyvältä, vaan siitä että tarkistus toimii oikein. Nyt tuo sovellus ei enää näytä aprillipilaa käyttäjälle jos käyttäjä menee sivulle aprillipäivänä kello 23:59:59, vaikka pitäisi. Kuten sanottu, tässä tällä ei ole käytännössä mitään merkitystä, mutta jossakin toisessa yhteydessä sama virhe voisi olla hyvinkin vakava.
Eihän siinä sekunnissa menetäkään, mutta jos ohjelmoidaan tuolla tavalla, ja vaikkapa alettaisiin pyöristelemään lukuja esim. tunneilla, niin helposti takaraivoon jää tapa, että käytetään juuri tapaa, ettei "ensimmäisiä" pienimpiä yksiköitä oikeasti huomioidakaan ehtolauseessa.
Täss tapauksessa tosiaan kyse on vain parista sekunnista, muttei tapa iskostuisi koodin käyttäjälle, niin kannattaisi opettaa juuri "oikea" tapa.
Kiitos! Tein nuo puuttuvat sekunnit tarkoituksella joten olin tietoinen että kaksi sekunttia jää uupumaan pilasta. No, yritän parantaa tapani ja tehdä ohjelmia jotka täyttävät kriteerit. Kritiikki on aina tervetullutta, niistä oppii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.