Avatar billede amix Nybegynder
27. februar 2004 - 20:44 Der er 4 kommentarer og
1 løsning

Ta' ikke ekstra skudår dage

Hejsa

Jeg har følgende kode som jeg bruger til at trække de ekstra skudår dage - dog virker scriptet ikke rigtigt når f.eks. datoen er 29. 2. 1996

$tid_nu = mktime();
preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{4})/", $row[dato], $datoen);

$tid_der = mktime(0,0,0, $datoen[2], $datoen[1], $datoen[3]);
             
//Skud år
//2004-2000-1996-1992-1988-1984-1980-1976-1972
$nu = date('Y');
$mrkaar = $datoen[3];
             
$skud_aar = array(1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012);
for($i = 0; $i <= count($skud_aar); $i++) {
if($mrkaar <= $skud_aar[$i] and $nu != $mrkaar and $nu > $skud_aar[$i])
$tid_der += 86400;
}
             
              $diff = $tid_nu - $tid_der;
             
              $years = intval($diff/(60*60*24*365));
              $diff -= ($years*60*60*24*365);
              $months = intval($diff/(60*60*24*30));
              $diff -= ($months*60*60*24*30);
              $days = intval($diff/(60*60*24));

Ok, det er lidt fucked at paste kode, men håber i kan se sammenhængen. Problemet er sikkert her:
$tid_der += 86400;
Det virker fint hvis man ikke subtrahere de ekstra dage.
Avatar billede detox Nybegynder
27. februar 2004 - 22:18 #1
Hvad går det egentlig ud på. Kunne du prøve at forklare det på en anden måde?
Avatar billede Slettet bruger
27. februar 2004 - 23:34 #2
Amix, det lyder som om du er ved at gøre noget, der egentlig er ganske let, meget besværligt - i hvert fald, hvis du holder dig indenfor 1970-2038.

Måske kan du få lidt inspiration fra dette script:

<?php


$gavetid=mktime(18,30,0,12,24,2004,0);
setlocale(LC_TIME, "da_DK");
echo tidsafstand_tekst($gavetid);


function tidsafstand_tekst($tid){
  $afstand=tidsafstand($tid);

  $tekst='';
  if ($afstand['year']!=0){ $tekst.="{$afstand['year']} år, "; }
  if ($afstand['mon']!=0){ $tekst.="{$afstand['mon']} måneder, "; }
  if ($afstand['mday']!=0){ $tekst.="{$afstand['mday']} dage, "; }
  if ($afstand['hours']!=0){ $tekst.="{$afstand['hours']} timer, "; }
  if ($afstand['minutes']!=0){ $tekst.="{$afstand['minutes']} minutter, "; }
  if ($afstand['seconds']!=0){ $tekst.="{$afstand['seconds']} sekunder, "; }

  $tekst=preg_replace('/(.*),\s(.*?),\s$/', '\\1 og \\2', $tekst);

  if ($afstand['fremtid']) {
    $tekst="Der er " . $tekst . " til " . strftime('%c',$tid);
  } else {
    $tekst=strftime('%c',$tid) . " var for " . $tekst . " siden.";
  }

  return $tekst;

}

function tidsafstand($tid){
  if ($tid<time()){
    $sidst=getdate();
    $foerst=getdate($tid);
    $svar['fremtid']=FALSE;
  } else {
    $sidst=getdate($tid);
    $foerst=getdate();
    $svar['fremtid']=TRUE;
  }
  $svar['seconds']=$sidst['seconds']-$foerst['seconds'];
  if ($svar['seconds']<0){$svar['seconds']+=60;$sidst['minutes']-=1;}
  $svar['minutes']=$sidst['minutes']-$foerst['minutes'];
  if ($svar['minutes']<0){$svar['minutes']+=60;$sidst['hours']-=1;}
  $svar['hours']=$sidst['hours']-$foerst['hours'];
  if ($svar['hours']<0){$svar['hours']+=24;$sidst['mday']-=1;}
  $svar['mday']=$sidst['mday']-$foerst['mday'];
  if ($svar['mday']<0) {
    if ($svar['fremtid']){
      $temp=date('t',mktime(0,0,0,$sidst['mon']-1,1,$sidst['year']));
    } else {
      $temp=date('t',mktime(0,0,0,$foerst['mon'],1,$foerst['year']));
    }
    $svar['mday']+=$temp;
    $sidst['mon']-=1;
  }
  $svar['mon']=$sidst['mon']-$foerst['mon'];
  if ($svar['mon']<0){$svar['mon']+=12;$sidst['year']-=1;}
  $svar['year']=$sidst['year']-$foerst['year'];

  return $svar;
}


?>
Avatar billede detox Nybegynder
28. februar 2004 - 02:47 #3
Hvad handler det om?
Avatar billede amix Nybegynder
28. februar 2004 - 17:03 #4
Detox en script som beregner hvor gamle folk er - i år, måneder og dage.

Har selv løst problemet ved at bruge nogle ASP funktioner i  PHP - selvom jeg aldrig har programmeret i ASP Ø_Ø.

Her er arbejdskoden, hvis nogen skulle løbe i samme problem. Ikke lige det reneste kode, da dette er mit test script ;)

function datediff($per,$d1,$d2) {
  $d = $d2-$d1;
  switch($per) {
      case "yyyy": $d/=12;
      case "m": $d*=12*7/365.25;
      case "ww": $d/=7;
      case "d": $d/=24;
      case "h": $d/=60;
      case "n": $d/=60;
  }
  return round($d);
}

function dateadd($per,$n,$d) {
  switch($per) {
      case "yyyy": $n*=12;
      case "m":
        $d=mktime(date("H",$d),date("i",$d)
            ,date("s",$d),date("n",$d)+$n
            ,date("j",$d),date("Y",$d));
        $n=0; break;
      case "ww": $n*=7;
      case "d": $n*=24;
      case "h": $n*=60;
      case "n": $n*=60;
  }
  return $d+$n;
}

    preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{4})/", $row[dato], $datoen);
             

  $dato = mktime(0,0,0, $datoen[2], $datoen[1], $datoen[3]);
  $years = datediff ('yyyy', $dato, mktime());
  $dato = dateadd('yyyy', $years, $dato);
  $monthz = datediff('m', $dato, mktime());
        if($monthz < 0) {
    $dato = dateadd("yyyy",-1, $dato);
    $monthz = datediff ("m",$dato,mktime());
    $years = $years - 1;
    }
      $dato = dateAdd("m",$monthz,$dato);
  $dayz= datediff ("d",$dato,mktime());
 
  if ($dayz < 0) {
    if ($monthz > 0) {
      $monthz -= 1;
    }
    else {
      $years -= 1;
      $monthz = 11;
    }
    $dato = dateadd("m",-1,$dato);

    $dayz = datediff ("d",$dato,mktime());
    }

 
                    if($years == 0) {
                        $years = '';
                    }
                    else {
                      $years = $years.' &#229;r';
                    }
                    $dayz = abs($dayz);
Avatar billede amix Nybegynder
23. marts 2004 - 22:30 #5
over and out
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