Autor Zpráva
solba
Profil
Zdravím,
tak mám tady malinu, pro nektere z vas.
Mam problem se zjistenim dnů v tydnu. Jde mi o to, ze zadam dve hodnoty, a tim jsou číslo tydne a rok.
napr (27.tyden a rok 2008) a jde mi o to, abych dostal:
30.6. Po
1.7.
2.7.
3.7.
4.7.
sobotu a nedeli vynechat ...

Neco jsem zkousel, ale po serii pokusu a omylu, ne-e :)
Mockrat dekuji za napady, rady a reseni ;)
Joker
Profil
Teď záleží na tom, jakým způsobem jsou ty týdny číslované. Když budu vycházet podle ISO, tak mě napadá takovýhle algoritmus:
1. Zjistím, kolikátý den v týdnu je 1. ledna daného roku (1= pondělí, 2= úterý,...,7 = neděle)... to bude $den.
2. Podle ISO čtvrtek určuje, do kterého roku týden patří (tj. pokud je 1. ledna dřív než čtvrtek, patří celý ten týden od pondělka do nového roku, pokud později, patří celý ten týden do starého roku). Takže teď musím zjistit, kolik dní tím daný rok získal nebo ztratil. Závislost na dni v týdnu, kdy je 1. leden, je: po 0, út +1, st +2, čt +3, pá -3 so -2, ne -1.
Takže: $modifikator = ($den > 4) ? ($den - 8) : ($den - 1);
3. 7 * (kolikátý týden chci) + $modifikator by mělo být pořadí dne v roce, kterým začíná daný týden.

Jestli to tak není, tak mě nekamenujte :-) Možná bude potřeba někde přičíst 1 nebo odečíst 1 nebo tak něco :-D
solba
Profil
jej, diky, je to trosku nova metoda,
ja jsem vychazel z toho, ze jsem zadal tyden, vynasobil 7($dny = $tyden*7), zjistil jsem pocet dnu
pote jsem mel v array ulozene pocty dnu (jako mesice) cili $mesice = array(1=>31,$unor,31,30 ...)
za unor jsem dosazoval 28 nebo 29, dle roku
pote jsem od dnu odecital mesice (po jednom), dokud vysledne cislo nebylo vetsi jak 0 a mensi jak pocet dni v poslednim odecitanem mesice (jeste se neztracite ?:D), pak od toho jsem od tohoto cisla odecetl 7, a byl jsem na prvnim dnu v tomto tydnu a zde je prave kolize, kdyz odecitam 7, tak vysledne cislo muze byt take zaporne, to jsem osetroval odectem dnu, v predslem odecitanem mesici ( a ted jste mozna ztraceni :) ) ale vzdy byla nejaka kolize,
proto prosim o zcela jiny postup :)
nejlepe fungujici priklad
dekuji a zdravim
Joker
Profil
solba
ja jsem vychazel z toho, ze jsem zadal tyden, vynasobil 7($dny = $tyden*7), zjistil jsem pocet dnu
No, já dělám podobnou věc, jen složitěji :-)
Potíž je totiž v tom, že (týden * 7)-tý den v roce bude pro každý rok jiný den v týdnu. A navíc ten den ani nemusí být součástí toho správného týdne! Alespoň podle té ISO je to den ze "správného" týdne jen pokud daný rok začíná ve čtvrtek nebo později. Pokud daný rok začíná ve středu nebo dřív, je to den až z následujícího týdne.
Například letos- 1. ledna bylo úterý, což znamená, že podle ISO je 1. týden 2008 31.12.2007 - 6.7.2008. Když vezmu 1. týden, tak 1*7=7, tedy datum 7. ledna, což je ovšem pondělí druhého týdne.

No a tohle řeší právě ten modifikátor, který eliminuje to, že rok nezačíná pokaždé ve stejný den v týdnu a současně že dny na konci/začátku roku mohou ve skutečnosti patřit k prvnímu/poslednímu týdnu následujícího/předcházejícího roku.
Mimochodem, když si zkusíte ten můj výpočet třeba pro ten příklad co jsem napsal, bude viditelné, že to ve skutečnosti nedá začátek, ale konec daného týdne... tj. neděli.
solba
Profil
Uz tomu zacinam rozumet :)
O neco se pokusim, jen co se proberu z deliria ;)
solba
Profil
No, tak co se tyce toho modifikatoru, kdyz dam 7 * (kolikátý týden chci) + $modifikator, tak mi to hodi volovinu, kdyz ale dam -, tak mi to vypise posledni den, cili nedeli v zadanem tydnu. Zkusim vychazet, ze tento predpoklad je spravny, cili ted budu postupne snizovat o poctu dni v mesici, pocinaje lednem dokud nebude cislo mensi jako pocet dnu v poslednim odecitanem mesici.
Pokud delam neco spatne tak me zavcas zarazte :D
solba
Profil
- jej, ty plusy a minusy mely byt tucne ! :(
solba
Profil
Takze, jsem zde s resenim
Nakonec to bylo snazsi, nez jsem si myslel. Jokere, diky za ten modifikator !
A vysledek:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
//require "inc/config.php";
//require "inc/core.php";

if(!isset($_POST['tyden'])) $_POST['tyden'] = date(W);
if(!isset($_POST['rok'])) $_POST['rok'] = date(Y);
$tyden = $_POST['tyden'];
$rok = $_POST['rok'];

$prvniDen = date("N", mktime(0,0,0,1,1,$rok));
$modifikator = ($prvniDen > 4) ? ($prvniDen - 8) : ($prvniDen - 1);
$dny = $tyden * 7 - $modifikator - 7;
$hodiny = $dny * 24;

for ($i = 0; $i <= 4; $i++)
 {
  $datum = date("j.n.", mktime($hodiny,0,0,1,1+$i,$rok));
  echo "$datum<br>";   
 }
?>
<br><br>
<form method=post>
tyden:<input type=text name="tyden" value="<?php echo $_POST['tyden'];?>" size=4/><br>
rok: &nbsp;&nbsp;<input type=text name="rok" value="<?php echo $_POST['rok'];?>" size=4/><br>
<input type=submit>
</form>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0