Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kuukauden päivät

Sivun loppuun

creepy [31.03.2015 16:40:53]

#

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ä

Eki++ [31.03.2015 17:12:39]

#

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.

creepy [31.03.2015 17:17:48]

#

Kiitos, vaikka en tosiaan itsekkään mielellään pearia käytä

Metabolix [31.03.2015 17:50:34]

#

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";

Tukki [31.03.2015 18:11:12]

#

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";
}

Metabolix [31.03.2015 18:31:11]

#

Aina IntlDateFormatter ei ole käytettävissä. Meinasin kyllä ehdottaa sitäkin vaihtoehdoksi, mutta eipä ollut omalla koneella asennettuna.

creepy [31.03.2015 19:05:07]

#

Kiitoksia erittäin, paljon näillä pääsen hyvin eteenpäin. Olisin tehnyt ite paljon hankalammin.

Tukki [31.03.2015 19:12:21]

#

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.

The Alchemist [31.03.2015 22:55:04]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta