Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Aika (if-lause)

masiaro [10.03.2014 14:07:03]

#

Moi,

Tätä koodia on käytännössä vaikea testata. Mitä luulette, toimiiko koodi oikein myös keskiyöllä vuorokauden vaihtuessa?

$aika2 = date("H:i");
$vkp = date("D");

if($vkp == "Mon" || $vkp == "Tue" || $vkp == "Wed" || $vkp == "Thu" || $vkp == "Fri")  {
	if($aika2 > "16:00" && $aika2 < "8:00")  {
		$teksti = "Kiinni";
		} else {
		$teksti = "Auki";
		}
} elseif($vkp == "Sat")  {
	if($aika2 > "15:00" && $aika2 < "9:00")  {
		$teksti = "Kiinni";
		} else {
		$teksti = "Auki";
		}
} elseif($vkp == "Sun")  {
	if($aika2 > "12:00" && $aika2 < "10:00")  {
		$teksti = "Kiinni";
		} else {
		$teksti = "Auki";
		}
}

Eli palauttaako koodi oikein, että arkisin klo 8-16 välisenä se palauttaa Auki-tekstiä, muttoin Kiinni-tekstiä? En vielä saanut käsitystä miten koodi käyttäytyy esim vuorokauden vaihtuessa pe->la ?

Lebe80 [10.03.2014 14:10:11]

#

Mitenköhän merkkijonon kanssa sujuu suurempi kuin ja pienempi kuin vertailut?

Kannattaa varmaan ensiksi testata ihan lähiminuutteina osuvilla kellon ajoilla.

Itsehän tuosta ottaisin ihan selkeyden vuoksi suoraan aikaleimoilla aikavertailut tai jokuhan voisi testata vastaavasti vain tuntien kokonaisluvuilla.

En usko, että php tajuaa merkkijonon "15:00" olevan kellonaika ja pysty vertailemaan onko jokin arvo sitä suurempi tai pienempi niin, että lopputulos olisi toimiva jokaisessa tapauksessa.

edit:
Ja haluisin tietää, miten jokin muuttujan arvo voi olla suurempi kuin 16, mutta samalla pienempi kuin 8....

Haraldinho [10.03.2014 14:10:53]

#

Kyllä tuo minusta toimii vuorokauden vaihtuessakin. Tuo merkkijonojen vertailu tosin...

The Alchemist [10.03.2014 15:27:20]

#

Vaikea testata? No nyt on pakko kysyä, että mitä helvettiä? Laitat muuttujiin $aika2 ja $vkp (onpas hirveän huonot nimet noilla) sopivat arvot ja ajat skriptisi -> testattu.

masiaro [10.03.2014 16:55:06]

#

Kiitos vastauksistanne.

Olipa merkkijono mitä tahansa mutta ainakin && merkillä toimii (?). || onkin järkevämpi valinta. Tsekkaan sit miten pelaa. Miten ehdottamasi aikavertailut aikaleimalla sitten onnistuu?

The Alchemist, en hoksannut tota ennen kuin laitoin postauksen tänne. Ja eikö olis hyvä käyttää samaa kieltä pitkin skriptiä, eli suomeksi. ;)

The Alchemist [10.03.2014 17:09:32]

#

Suomen kielen käyttö olikin yksi syy, miksi ihmettelin, miksi testaat aikaa englanninkielisten päivien nimillä. Olisi loogisempaa ja helpompaa käyttää numeerisia arvoja. Nimien hirveys ei kuitenkaan ole kielisidonnainen asia tässä tapauksessa.

Metabolix [10.03.2014 17:27:03]

#

Jos haluat vertailla kellonaikoja merkkijonoina – mikä on minusta ihan hyvä ratkaisu koodin luettavuuden kannalta –, käytä etunollia.

echo ("9:00" < "10:00") ? "on\n" : "ei\n";  // ei, koska "9" > "1"
echo ("09:00" < "10:00") ? "on\n" : "ei\n"; // on, koska "0" < "1"

Viikonpäiviäkin voi käsitellä lukuina, ja useampi vaihtoehto on helppo tarkistaa funktiolla in_array.

$viikonpäivä = date("N"); // 1–7
if (in_array($viikonpäivä, array(6, 7))) {
	echo "Viikonloppu.\n";
}

masiaro kirjoitti:

Eli palauttaako koodi oikein, että arkisin klo 8-16 välisenä se palauttaa Auki-tekstiä, muttoin Kiinni-tekstiä?

Ei, koska etunollat puuttuvat ja olet yhdistänyt ehdot väärin (&& vs. ||).

masiaro kirjoitti:

En vielä saanut käsitystä miten koodi käyttäytyy esim vuorokauden vaihtuessa pe->la ?

Kun koodi suoritetaan, on jokin tietty päivä ja kellonaika. Jos koodi toimii oikein perjantaina 23:59:59 ja lauantaina 00:00:00, se toimii oikein myös ”vuorokauden vaihtuessa”, koska noiden aikojen välissä ei ole mitään mystistä siirtymätilaa. Ainoa virheen mahdollisuus on, että vuorokausi vaihtuu juuri ensimmäisen date-kutsun jälkeen ennen toista date-kutsua, mutta koodisi tapauksessa lopputulos ei tästä muutu, koska keskiyöllä tulos on joka päivä sama. Voit kuitenkin korjata asian niin, että otat aikaleiman ensin talteen ja käytät sitä molemmissa date-kutsuissa.

Kannattaa myös tehdä tarkistuksesta funktio ja siis erottaa laskut ja tulostus.

function auki($aika) {
	$kellonaika = date("H:i", $aika);
	$viikonpäivä = date("N", $aika);
	switch ($viikonpäivä) {
		case 6: return "08:00" <= $kellonaika && $kellonaika <= "16:00";
		case 7: return "09:00" <= $kellonaika && $kellonaika <= "15:00";
		default: return "10:00" <= $kellonaika && $kellonaika <= "12:00";
	}
}

if (auki(time())) {
	echo "Auki";
} else {
	echo "Kiinni";
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta