Avatar billede doc404 Novice
30. marts 2006 - 00:27 Der er 8 kommentarer og
2 løsninger

Beregne dato

Er der en, der lige kan ryste noget php kode ud af ærmet..

Input:

dato i yyyy-mm-dd format.

Output:

dato, der er den først kommende 1st eller 15. efter inputdato + 15 dage.

Eksempel:

Inputdato: 29-03-06 outputdato: 15-04-06.
Avatar billede jensgram Nybegynder
30. marts 2006 - 00:42 #1
$d, $m, $y = dato

$d += 15;
$t = mktime(0, 0, 0, $d, $m, $y);

while (date("j", $t) != 1 && date("j", $t) != 15) {
    $d++;
    $t = mktime(0, 0, 0, $d, $m, $y);
}

... nu er $t korrekt.
Avatar billede jensgram Nybegynder
30. marts 2006 - 00:44 #2
Kunne sikkert være lavet pænere, og er desuden utestet, men idéen er vist godt nok.


Nej, måske:

$d, $m, $y = dato

$d += 15;
$t = mktime(0, 0, 0, $d, $m, $y);

while ($d != 1 && $d != 15) {
    $d++;
    $t = mktime(0, 0, 0, $d, $m, $y);
}

... nu er $t korrekt.


, da vi jo ændrer $d ved hvert gennemløb.
Avatar billede coderdk Praktikant
30. marts 2006 - 11:34 #3
Den sidste ville ikke gå. Hvad hvis $d er over 15 fra starten? ;)
Din første løsning ville virke, ellers er en anden løsning:

$dato = strtotime( '2006-03-30' );
while ( !in_array( date( 'j', $dato ), array( '1', '15' ) ) )
{
  $date = strtotime( '+1 day', $dato );
}
Avatar billede coderdk Praktikant
30. marts 2006 - 11:35 #4
$date = strtotime( '+1 day', $dato );

skulle jo have været:

$dato = strtotime( '+1 day', $dato );

;)
Avatar billede jensgram Nybegynder
30. marts 2006 - 14:04 #5
Coderdk > mktime normaliserer automatisk, hvis der er roll-over, men du har sikkert ret.
Avatar billede coderdk Praktikant
30. marts 2006 - 14:10 #6
jensgram, derfor virker det i dit første eksempel, men dit andet inkrementerer du jo bare $d uden at den bliver ændret andre steder - Derfor ville det ikke virke :)
Avatar billede jensgram Nybegynder
30. marts 2006 - 14:12 #7
Ah ja, nu kan jeg se det. Min fejl.
Avatar billede doc404 Novice
30. marts 2006 - 21:48 #8
Tak skal I have de herre...

Smid begge et svar.
Avatar billede jensgram Nybegynder
30. marts 2006 - 21:51 #9
Tjek...
Avatar billede coderdk Praktikant
31. marts 2006 - 00:47 #10
Ok :) Jeg så lige jensgrams første forslag faktisk heller ikke vil virke, hvis det f.eks. er den 31. i en måned, da han lægger 15 til - hvis han ikke havde gjort det, ville det også virke :D Faktisk BØR man lægge én til, inden man går ind i loopet, ellers vil den være sand hvis det er den 1. eller 15. - Og derfor ville den ikke finde den næste... :) Så min modificerede udgave:

$dato = strtotime( "+1 day", strtotime( '2006-03-30' ) );
while ( !in_array( date( 'j', $dato ), array( '1', '15' ) ) )
{
  $date = strtotime( '+1 day', $dato );
}
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