Avatar billede dcheng Novice
24. august 2006 - 14:10 Der er 28 kommentarer og
3 løsninger

print dato'er i en specifik uge.

Hvis nu jeg bruger date("W")

Kan jeg så på nogen måder få den til at spytte de datoer ud som er i det uge nummer? Gerne i en løkke...
Avatar billede gizmo-gizmo Nybegynder
24. august 2006 - 15:07 #1
Et vildt bud (det kan sikkert gøres bedre og smartere hvis man er smart :))

<?php
$week = date('W');
$ts = strtotime("+".($week-1)." weeks", strtotime("01/01/2006")) + 86400;

for($i=0; $i<7; $i++)
{
  $d = ($ts+86400*$i);
  echo date("d/m/Y", $d) . " ("  . date("D", $d) . ") <br/>";
}
?>
Avatar billede Slettet bruger
24. august 2006 - 15:16 #2
Hmm... ja det virker men kan ikke lige finde ud af hvad pokker du gør...
Først finder du denne uge ($week).
Hvorfor har du "+" i starten af din strtotime?
Og hvad bruger du datoen 01/01/2006 til?
Hvorfor plusser du med 86400?

Så er der din for-løkke.
Hvorfor plusser du igen med 86400?
Avatar billede Slettet bruger
24. august 2006 - 15:18 #3
$week = date('W');
$weekday = date('w');
if(0==$weekday)$weekday=7; // Søndag er sidste dag i ugen.
$weekday--;
$startdate = strtotime('-$weekday days'))

for($i=0;$i<7;;$i++)
{
  echo date('d/m/Y', strtotime('+$i days', $startdate));
}
Avatar billede Slettet bruger
24. august 2006 - 15:19 #4
86400 = 24*60*60 = antal sekunder i et døgn.
Avatar billede Slettet bruger
24. august 2006 - 15:22 #5
Ok, min kan ikke bruges, for den går ud fra dags dato. Men gizmos virker kun i år hvor 1/1 ligger i uge 1.
Avatar billede Slettet bruger
24. august 2006 - 15:30 #6
men det kan man vil bare ændre, så den kører på nogen inputs man får enten via $_GEt eller $_POST, så dine indeholder nogen andre tal, f.eks. uge og år.

Men sandbox kan du svar på mit spørgsmål her: 24/08-2006 15:16:44
Avatar billede Slettet bruger
24. august 2006 - 15:30 #7
Men en kombination vil virke. Det er nemlig sikkert, at 4/1 altid vil være i uge 1:

$week=date('W');

$ts = strtotime('+'.($week-1).' weeks', strtotime('Jan 04 ' . date('Y') . '12:00:00'));
$weekday = date('w', $ts);
if(0==$weekday)$weekday=7; // Søndag er sidste dag i ugen.
$weekday--;
$startdate = strtotime('-$weekday days'))

for($i=0;$i<7;;$i++)
{
  echo date('d/m/Y', strtotime('+$i days', $startdate));
}

Grunden til at jeg regner med klokken 12 er for at komme uden om bøvl med sommertidsskift.
Avatar billede Slettet bruger
24. august 2006 - 15:30 #8
Så ikke du havde svaret på noget af det :D
Avatar billede Slettet bruger
24. august 2006 - 15:35 #9
Han brugte 1/1-2006 + 86400 sekunder for at få starten på 1. uge i 2006. Den holder bare ikke for andre år.

strtotime kan lave smarte udregninger med basis i et eksisterende timestamp. Det bruges +et til i begge vores kode.

Og så en rettelse til min sidste kode:

$week=date('W');

$ts = strtotime('+'.($week-1).' weeks', strtotime('Jan 04 ' . date('Y') . '12:00:00'));
$weekday = date('w', $ts);
if(0==$weekday)$weekday=7; // Søndag er sidste dag i ugen.
$weekday--;
$startdate = strtotime('-$weekday days', $ts))

for($i=0;$i<7;;$i++)
{
  echo date('d/m/Y', strtotime('+$i days', $startdate));
}
Avatar billede Slettet bruger
24. august 2006 - 15:35 #10
Og en rettelse mere:

$week=date('W');

$ts = strtotime('+'.($week-1).' weeks', strtotime('Jan 04 ' . date('Y') . '12:00:00'));
$weekday = date('w', $ts);
if(0==$weekday)$weekday=7; // Søndag er sidste dag i ugen.
$weekday--;
$startdate = strtotime("-$weekday days"))

for($i=0;$i<7;;$i++)
{
  echo date('d/m/Y', strtotime("+$i days", $startdate));
}
Avatar billede Slettet bruger
24. august 2006 - 15:36 #11
Argh!

$week=date('W');

$ts = strtotime('+'.($week-1).' weeks', strtotime('Jan 04 ' . date('Y') . '12:00:00'));
$weekday = date('w', $ts);
if(0==$weekday)$weekday=7; // Søndag er sidste dag i ugen.
$weekday--;
$startdate = strtotime("-$weekday days", $ts));

for($i=0;$i<7;;$i++)
{
  echo date('d/m/Y', strtotime("+$i days", $startdate));
}
Avatar billede gizmo-gizmo Nybegynder
24. august 2006 - 15:58 #12
Sandbox: Du har ret, min virkede ikke i andre år. Her er til gengæld en endnu dejligere og overskuelig løsning der virker :-)

$week=date('W');
$ts=strtotime('+'.($week-1).'weeks',strtotime('next monday',strtotime('12/31/'.(date("Y")-1))));

for($i=0; $i<7; $i++) {
  echo date('d/m/Y (D)',($ts+86400*$i)).'<br/>';
}
Avatar billede gizmo-gizmo Nybegynder
24. august 2006 - 16:05 #13
Glem ovenstående kommentar fra mig af... jeg har ikke forstand på datoer :-/
Avatar billede Slettet bruger
24. august 2006 - 16:12 #14
Nej, jeg vil ikke glemme det, for det var faktisk en god ide. (bortset fra at uge 1 kan starte så tidligt som 29/12 visse år)

$week=date('W');

$ts = strtotime('next monday', strtotime('Dec 28 ' . date('Y')-1 . '12:00:00'));
$startdate = strtotime('+'. $week-1 . . ' weeks", $ts));

for($i=0;$i<7;;$i++)
{
  echo date('d/m/Y', strtotime("+$i days", $startdate));
}
Avatar billede Slettet bruger
24. august 2006 - 16:12 #15
Hov, der var lige et . for meget.
Avatar billede Slettet bruger
24. august 2006 - 16:33 #16
og dobbelt ; i din for-løkke
Avatar billede dcheng Novice
24. august 2006 - 19:34 #17
WOW, jeg kan kun lige sige at jeg kigger svarene igennem senere i aften da jeg har ldit travlt men skulle bare checke mail ... men den blev bombet af exp :P

Tak indtil videre!!
Avatar billede Slettet bruger
24. august 2006 - 21:07 #18
Jeg lægger lige et svar med det samme, hvis du kan bruge det til noget. Men husk at den sidste løsning er lige så meget gizmos fortjeneste som min.
Avatar billede Slettet bruger
24. august 2006 - 21:09 #19
Og så tager vi lige løsningen med alle kendte rettelser (dvs. de allerede nævnte + en til):

$week=date('W');

$ts = strtotime('next monday', strtotime('Dec 28 ' . date('Y')-1 . '12:00:00'));
$startdate = strtotime('+' . $week-1 . ' weeks', $ts));

for($i=0;$i<7;$i++)
{
  echo date('d/m/Y', strtotime("+$i days", $startdate));
}
Avatar billede gizmo-gizmo Nybegynder
24. august 2006 - 21:15 #20
Det endte da med at blive relativt nydeligt :-)
Avatar billede Slettet bruger
24. august 2006 - 21:28 #21
Og nu da vi har rodet så meget rundt med det, kan jeg da lige komme med den officielle definition af hvilken uge, der er nummer 1 i et år.

Det er den tidligste uge, som er mindst 50% i det år. Dette kan omregnes til den tidligste uge med en torsdag på 1/1 eller senere, hvilket igen kan omregnes til den første uge, der starter efter 28/12.
Avatar billede dcheng Novice
24. august 2006 - 22:22 #22
<?
$week = date('W');

$ts = strtotime('next monday', strtotime('Dec 28 ' . date('Y')-1 . '12:00:00'));

$startdate = strtotime('+' . $week-1 . ' weeks', $ts);

for($i=0;$i<7;$i++)
{
  echo date('d/m/Y', strtotime("+$i days", $startdate))."<BR>";
}
?>
------

Hvorfor viser den ikke 2006, men istedet 1970?

24/08/1970
25/08/1970
26/08/1970
27/08/1970
28/08/1970
29/08/1970
30/08/1970

Men det ser godt nok fornemt ud, jeg kunne aldrig komme på det der.
Avatar billede Slettet bruger
24. august 2006 - 22:42 #23
Det har du sørme ret i - bortset fra at min testudgave starter på 21/8 i stedet for 24/8

Nu tester jeg altså. Så næste indlæg fra mig bliver et 100% fungerende script, der er testet.
Avatar billede Slettet bruger
24. august 2006 - 22:43 #24
Rettelse: det var 31/8, min udgave af samme kode startede på.
Avatar billede Slettet bruger
24. august 2006 - 23:18 #25
Så har jeg en virkende udgave, som det også er let at teste med andre årstal og ugenumre.

http://skema.tuxino.dk/ugenummer.php
Avatar billede Slettet bruger
24. august 2006 - 23:26 #26
Som det kan ses endte jeg med at bruge mktime() i stedet for strtotime til at lave det første timestamp.
Avatar billede Slettet bruger
24. august 2006 - 23:34 #27
Forresten: Det sidste script virker (på min server) kun mellem uge 2 1970 og uge 2 2038. Dette er et resultat af den måde et timestamp behandles internt af PHP - faktisk havde jeg regnet med at det ville virke tilbage til ca 1900, da det normalt kun er Windows-maskiner, der benytter et 32-bit timestamp og ignorerer fortegn.

Hvis det skulle virke udover disse datoer, kan jeg også godt skrue noget sammen, men så bliver koden ikke så simpel.
Avatar billede dcheng Novice
24. august 2006 - 23:58 #28
Jamen sandbox jeg er nødt til at tage hatten af for dig. Både for din vilje for at løse problemet og din hjælpsomhed. Jeg mener du får jo ikke noget for at hjælpe... Men du bruger en hel del tid? I min verden er tid=penge, og jeg hjælper kun herinde hvis jeg er keder mig totalt, hvilket jeg ikke har gjort længe..

Men det eneste jeg kan gøre at at give dig point og sige mange tusind tak. Jeg er nok ikke god nok til php til at kunne hjælpe dig, du er 2 ligaer over mig :D

Men igen jeg siger mange tak de herrer
Avatar billede dcheng Novice
25. august 2006 - 00:02 #29
Hmm kunne ikke finde ud af at dele point ordenligt skrev først
5/25 - det gad den ikke tage
20/80 - det gad den heller ikke (troede det var %)
1/5 eller også 1/4 - så delte den 13/16

Underligt!
Avatar billede Slettet bruger
25. august 2006 - 01:22 #30
Så længe du kommer med opgaver, som det er interessant at løse, så hænger jeg på - når jeg har tid. Det bliver nok ikke til så meget når skolen starter igen på mandag, men nu har jeg også holdt sommerferie nok til at det keder mig ;-)

Og jo, jeg får faktisk noget ud af at hjælpe. Jeg får nemlig dybere kendskab til PHP og kommer rundt i de krinkelkroge, som jeg ellers ikke ville.

Men du har da ret i at pointene er rundt regnet ligegyldige. De kan ikke bruges til andet end at optjene pro-medlemsskab til næste måned, og den skulle da være hjemme nu.
Avatar billede gizmo-gizmo Nybegynder
25. august 2006 - 17:15 #31
Denne slags små, men tricky opgaver, er de mest spændende at løse. Den slags hvor man lige skal tænke sig om, i stedet for at at hamre 2000 linjers triviel kode ned. Jeg har det sådan at jeg ikke kan KLARE at give op og sige "det kan jeg ikke finde ud af".
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester