Mites tulostaa kätevästi kuukauden päivät jos kuukausi on valittu
esim.
Huhtikuu
ke 1.4.
to 2.4.
pe 3.4.
Varmaan saa jotenkin kätevästi enkä lähe virittelemään omia purkkavirityksiä
PHP Pear:in Calendar-kirjastolla
require_once 'Calendar/Month/Weekdays.php'; $kk = new Calendar_Month_Weekdays($vuosi, $kuukausi); $kk->build(); echo "<ul>"; while($pv = $kk->fetch()) { echo "<li>" . $pv->thisDay() . "</li>"; } echo "</ul>";
Viikonpäivinen mukaan saannista en ole niin varma. Sekavan dokumentaation syövereistä sain selville, että kuukausiolio täytyy käyttää dekoraattorin läpi jolloin mukaan saa thisDayName-metodin. Tämä kuitenkin vaatisi Pear::Date-kirjaston, jota ei enää kehitetä. Jotenkin siis näin:
require_once 'Calendar/Month/Weekdays.php'; require_once 'Calendar/Decorator/Textual.php'; // <-- require_once 'Date/Date.php'; // <-- setlocale(LC_TIME, 'fi_FI'); // <-- nimet oikein $kk = new Calendar_Month_Weekdays($vuosi, $kuukausi); $kk->build(); $dec = new Calendar_Decorator_Textual($kk); // <-- echo "<ul>"; while($pv = $dec->fetch()) { // <-- echo "<li>" . $dec->thisDayName($kk, 'short') . " " . $pv->thisDay() . "</li>"; // <-- } echo "</ul>";
Edeltävää en kokeillut, joten saattaa herjata, mutta you got the point. Kuitenkin jos joku tarjoaa jotakin vähänkään parempaa, niin käytä mielummin sitä. Itselleni on jäänyt Pearista jotenkin purkahtava maku suuhun.
Kiitos, vaikka en tosiaan itsekkään mielellään pearia käytä
Mihin tässä nyt ulkopuolista koodia tarvittaisiin? On ihan triviaalia tehdä silmukka, joka käy kuukauden päivät läpi: otetaan vain kuukauden alusta aikaleima (mutta ei 00:00, ettei kesäaika sotke) ja siirrytään päivissä eteenpäin, kunnes kuukausi vaihtuu.
Jos koodin suoritusympäristöstä ei ole varmaa tietoa, turvallisinta on kirjoittaa viikonpäivien nimet itse (tai käyttää kirjastoa, johon ne on kirjoitettu).
<?php $vuosi = date("Y"); $kuukausi = date("n"); setlocale(LC_TIME, 'fi_FI.UTF-8'); $t0 = strtotime(sprintf("%04d-%02d-01 08:00", $vuosi, $kuukausi)); echo "<ul>\n"; for ($t = $t0; date("m", $t) == date("m", $t0); $t += 86400) { $päivä = ["su", "ma", "ti", "ke", "to", "pe", "la"][date("w", $t)]; echo "<li>", $päivä, " ", date("j.n.", $t), "</li>\n"; } echo "</ul>\n";
Jos uskot, että järjestelmä osaa suomea, voit pyytää viikonpäivän nimen myös koneelta. Kuitenkin setlocalen oikea parametri ei ole kaikissa järjestelmissä sama, joten tämä koodi ei ole yhtä luotettava.
<?php $vuosi = date("Y"); $kuukausi = date("n"); setlocale(LC_TIME, 'fi_FI.UTF-8'); $t0 = strtotime(sprintf("%04d-%02d-01 08:00", $vuosi, $kuukausi)); echo "<ul>\n"; for ($t = $t0; date("m", $t) == date("m", $t0); $t += 86400) { echo "<li>", strftime("%a", $t), " ", date("j.n.", $t), "</li>\n"; } echo "</ul>\n";
Tosiaan aika turhaa tuoda tätä varten ulkoisia riippuvuuksia mukaan kun PHP:ssä on kohtuu monipuoliset päivämäärienkäsittelyominaisuudet itsessäänkin nykyään. Minä tekisin ehkäpä näin:
$month = 4; $year = 2015; $interval = new DateInterval('P1D'); $start = new DateTime('01.'.$month.'.'.$year.' 08:00'); $end = clone $start; $end->modify('+1 month'); $period = new DatePeriod($start, $interval, $end); $formatter = new IntlDateFormatter( "fi_FI", null, null, 'Europe/Helsinki', IntlDateFormatter::GREGORIAN, "E d.M" ); foreach($period as $day) { echo $formatter->format($day)."\n"; }
Aina IntlDateFormatter ei ole käytettävissä. Meinasin kyllä ehdottaa sitäkin vaihtoehdoksi, mutta eipä ollut omalla koneella asennettuna.
Kiitoksia erittäin, paljon näillä pääsen hyvin eteenpäin. Olisin tehnyt ite paljon hankalammin.
Metabolix kirjoitti:
Aina IntlDateFormatter ei ole käytettävissä. Meinasin kyllä ehdottaa sitäkin vaihtoehdoksi, mutta eipä ollut omalla koneella asennettuna.
Olet oikeassa, se tulee intl-laajennoksen mukana. Jotenkin itse olen ajatellut noita php:n omia laajennoksia kiinteäksi osaksi kieltä, kun en ole enää aikoihin koodannut php:tä alustalla, mihin niitä ei voisi itse helposti asentaa tarvittaessa.
Jokatapauksessa tuon muotoilun voi helposti muuttaa esimerkissäni toisenlaiseksi, kun $day on loopissa tavallinen DateTime-olio.
Tässä muuten on yksi hyvä esimerkki PHP:n "hienouksista". Päivämäärän tai timestampin voi muotoilla ainakin seuraavilla tavoilla: date()-funktiolla, DateTime-luokan format()-metodilla (tämä on kai oleellisesti sama kuin date()), IntlDateFormatter-luokalla ja strftime()-funktiolla. Äkkiseltään nämä vaikuttavat lähes samoilta, mutta niissäpä onkin oleellisia eroja kun tutkii tarkemmin. Muotoilustringit on kaikissa kolmessa tavassa erilaiset, ja ominaisuudet ovat erit. Esim. date()- ei tuo locale-asetuksia ja strftime():llä taas ei tietääkseni pysty muotoilemaan kuukautta numeroin niin että kuukaudet 1-9 tulisivat yhdellä numerolla.
Tukki kirjoitti:
Tässä muuten on yksi hyvä esimerkki PHP:n "hienouksista".
Php:n yksi ehdoton hienous on se, että joidenkin funktioiden (esim. sen strftimen) kohdalla tyydytään toteamaan, että c-kirjastojen välillä on toteutuskohtaisia eroja ja siitä syystä php-koodisi ei aina toimi kuten odotat.
Itse laskisin kaikki php:n vakiomoduulit "kiinteiksi osiksi" kieltä, koska jos kaikki moduulit käy napsimassa pois päältä, niin eipä tästäkään kielestä paljoa jää jäljelle.
Aihe on jo aika vanha, joten et voi enää vastata siihen.