Avatar billede myst1098 Nybegynder
26. juli 2006 - 15:13 Der er 14 kommentarer og
2 løsninger

Dato + 2,5 år

Jeg har i forvejen fået svar på hvordan man lægger et antal år til en given dato, ved hjælp af nedenstående funktion:

Men jeg får brug for også at kunne lægge et halvt år til, f.eks. 1,5 år. Hvordan kringler jeg den ?

function addyear($dato,$antal=1){
  list($d,$m,$a)=explode('-',$dato);
  $a=$a+$antal;
  if(2==$m && 29==$d){
    $skud=false;
    if(0 == $a % 4) $skud=true;
    if(0 == $a % 100) $skud=false;
    if(0 == $a % 400) $skud=true;
    if(!$skud) $d=28;
  }
  return "$d-$m-$a";
}

$nydato = addyear($gammeldato, 2);
Avatar billede hmortensen Nybegynder
26. juli 2006 - 15:16 #1
Du burde kunne nøjes med flg.:
$nydato = strtotime("+30 month", strtotime($gammeldato));
Avatar billede myst1098 Nybegynder
26. juli 2006 - 15:18 #2
ikke hvis datoen er fra før 01-01-1970
Avatar billede Slettet bruger
26. juli 2006 - 15:30 #3
Skal et halvt år være 365/2 dage eller bare 6 kalendermåneder?
Avatar billede myst1098 Nybegynder
26. juli 2006 - 15:32 #4
6 kalendermåneder ...
Avatar billede Slettet bruger
26. juli 2006 - 16:09 #5
function addyear($dato,$aar=1,$md=0){
  list($d,$m,$a)=explode('-',$dato);
  $a=$a+$aar;
  $m=$m+$md;
  while(12<$md){
    $md=$md-12;
    $a++;
  }
  if(31==$d && in_array($m, array(4,6,9,11)) $d=30;
  if(2==$m && 28<$d){
    $skud=false;
    if(0 == $a % 4) $skud=true;
    if(0 == $a % 100) $skud=false;
    if(0 == $a % 400) $skud=true;
    if(!$skud) $d=28;
  }
  if(10>$m) $d="0$m"; // tvinger måned til at være med to cifre
  return "$d-$m-$a";
}

Funktionen kan stadig bruges på de gamle måder:
$nydato = addyear("25-01-1855"); // lægger et år til
$nydato = addyear("25-01-1855", 2); // lægger to år til

Men nu er der en ny måde at kalde den:
$nydato = addyear("25-01-1855", 2, 6); // lægger 2 år og 6 måneder til
$nydato = addyear("25-01-1855", 0, 3); // lægger 3 måneder til

I tilfælde af at en beregnet dato overskrider længden på den beregnede måned, sættes den nye dato til sidste dag i måneden.
Avatar billede gizmo-gizmo Nybegynder
26. juli 2006 - 16:14 #6
Et lidt anderledes bud:

$r = mysql_fetch_assoc(mysql_query("SELECT ADDDATE('2006-07-26', INTERVAL +18 MONTH) AS dato"));
echo $r['dato'];

Den kan også bruges til datoer før 1970.
Avatar billede myst1098 Nybegynder
26. juli 2006 - 16:49 #7
Sandbox >

Jeg får en fejl i denne linie:

  if(31==$d && in_array($m, array(4,6,9,11)) $d=30;


gizmo >

Skal jeg forstå det sådan, at hvis jeg henter startdatoen fra en tabel, så kan Mysql klare det uden brug af ekstra programmering ?
Avatar billede myst1098 Nybegynder
26. juli 2006 - 16:56 #8
Nevermind...

Gizmo's version virker præcis som den skal. Jeg skulle bare lige lave en forbindelse til min Mysql før eksemplet virkede.

Tak for hjælpen begge 2 :o)
Avatar billede Slettet bruger
26. juli 2006 - 17:25 #9
Det var dog pokkers. Det er jo snart ikke til at være her for alle de geder, og så må jeg ikke engang have husdyr ;-)

Der manglede en ) sammen med de andre, så der er en klump på 3 )er
Avatar billede Slettet bruger
26. juli 2006 - 17:35 #10
Det var en interessant vinkel, du fandt gizmo-gizmo. I betragtning af hvor tit jeg fremhæver det smarte i at bruge DATETIME-felter i stedet for VARCHAR eller lignende for netop at kunne bruge de mange gode funktioner i MySQL, er det lidt underligt, at jeg ikke selv tænkte ad den retning. Måske fordi der ikke ellers var database involveret i spørgsmålet.
Avatar billede gizmo-gizmo Nybegynder
26. juli 2006 - 21:03 #11
Ja, det er faktisk ret genialt hvis jeg selv skal sige det :-) ej. Men det er mig en gåde hvorfor man ikke har samme muligheder i PHP. Jeg mener... datofunktioner er da noget som ALLE bruger.
Avatar billede Slettet bruger
27. juli 2006 - 03:25 #12
Måske fordi man faktisk kan gøre de samme ting med passende brug af strtotime() og date() - problemet var så bare, at den server myst1098 kører på tilsyneladende er en Windows-makine, og da PHP internt benytter operativsystemets tidsvariabel, understøtter den ikke datoer før 1970. (Det er fortegnsbitten, der ignoreres eller noget i den stil)

MySQL derimod har sin egen kode, som er uafhængig af operativsystemet.
Avatar billede myst1098 Nybegynder
27. juli 2006 - 21:48 #13
Giz >

Enig... Det er en lille smule underligt at skulle genopfinde den dybe tallerken til den slags.

Men under alle omstændigheder så løste I jo i fællesskab mit problem og tak for det :o)
Avatar billede Slettet bruger
27. juli 2006 - 23:25 #14
Det skal så siges, at min metode virker for alle positive år - dog uden hensyntagen til den julianske kalender, der blev benyttet indtil en gang i 15xx, og under hensyntagen til at årstallet skal kunne være i en talvariabel, som PHP benytter til normale beregninger. Hvis det skulle vise sig at være et problem, kan jeg sagtens lave sammenlægningslinien om til lidt kode, som manuelt regner på strengens indhold i stedet, hvormed begrænsningen vil blive PHPs strengstørrelse, og da manualen siger: " It is no problem for a string to become very large. There is no practical bound to the size of strings imposed by PHP, so there is no reason at all to worry about long strings.", skulle koden være ganske fremtidssikret ;-)

MySQL derimod kan foreløbig "kun" kan håndtere årstal op til 9999. Men mon ikke de når at få den begrænsning fikset, før den når at blive et problem. Desuden kan MySQL kun håndtere årstal ned til 1000.
Avatar billede myst1098 Nybegynder
27. juli 2006 - 23:45 #15
sandbox >

Det er ok som det er nu. :o)
Avatar billede Slettet bruger
28. juli 2006 - 00:05 #16
Fint. Jeg regnede nu heller ikke med at en øvre grænse ved år 2147483647 ville være et problem ;-)

(Desuden vil den endda virke højere end det, da den ved højere værdier benytter float til tallet i stedet for int, og de har normalt 14 betydende cifre.)
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