Avatar billede myst1098 Nybegynder
22. juli 2006 - 22:54 Der er 23 kommentarer og
1 løsning

I dag + 1 år

$nydato =date("d-m-Y",time()+1*365*24*60*60);

viser "22-07-2007" hvilket jo også er korrekt (baseret på at datoen i dag er 22-07-2006). Men...

$nydato =date("d-m-Y",time()+2*365*24*60*60);

viser "21-07-2008".

Jeg vil gerne lægge 2 år til datoen i dag således at jeg også rammer "22-07-2008".
Avatar billede nielle Nybegynder
22. juli 2006 - 23:04 #1
Husk nu at 2008 er et skudår. Derfor er der 366 dage og det er derfor at din udregning er off med 1 dag.
Avatar billede plx Nybegynder
22. juli 2006 - 23:05 #2
date("d-m-Y", strtotime("+2 years"));
Avatar billede myst1098 Nybegynder
22. juli 2006 - 23:08 #3
Præcis...

Det er derfor jeg efterspørger muligheden for at lægge 1 (eller flere) år til en dato. F.eks. for at finde ud af hvilken ugedag en given fødselsdato er om 2 år.
Avatar billede nielle Nybegynder
22. juli 2006 - 23:11 #4
Det fremgik ikke klart af dit spørgsmål at du var klar over at det var en skudårs-fejl.
Avatar billede myst1098 Nybegynder
22. juli 2006 - 23:14 #5
nielle >

Nej et kan godt være jeg formulerede det lidt kryptisk :o))

Smid svar begge 2, så deler I... :o)
Avatar billede nielle Nybegynder
22. juli 2006 - 23:15 #6
Nej tak på denne her, plx gav vist en udemærket løsning. :^)
Avatar billede myst1098 Nybegynder
22. juli 2006 - 23:33 #7
Hvad nu hvis startdatoen er 01-01-1960 ?
Avatar billede Slettet bruger
22. juli 2006 - 23:40 #8
Nu er det godt nok ikke relevant i din situation, men jeg vil alligevel lige gøre opmærksom på at man nogle gange skal finte sig uden om sommertidsskift. Her er lidt demo-kode:

<?php

header("Content-Type: text/plain");

function nm($dato)
{
  $dato = strtotime($dato);
  $w = date("w", $dato);
  $w = $w==0?7:$w;
  $adddays = 8-$w;
  echo "Dato: " . date("D d/m-Y H:i:s", $dato) . " - ";
  echo date("D d/m-Y H:i:s", strtotime("+ $adddays days", $dato)). " ";
  echo date("D d/m-Y H:i:s", strtotime("next monday", $dato)) . "\n";
}

nm("15 october 2005");
nm("22 october 2005");
nm("29 october 2005");
nm("5 november 2005");

?>

Det er derfor en god ide (når klokken alligevel er ligegyldig) at bruge klokken 12:00 til datoudregninger.
Avatar billede xhtml Nybegynder
23. juli 2006 - 18:36 #9
$nydato = date("d-m-Y", strtotime("+ 2 year"));
Avatar billede myst1098 Nybegynder
25. juli 2006 - 15:20 #10
xhtml >

Jo men hvis datoen f.eks. er 01-01-1950 så bliver resultatet 01-01-1970

date("d-m-Y", strtotime("+ 2 year". "1950-01-01"));
Avatar billede myst1098 Nybegynder
25. juli 2006 - 15:21 #11
Probemet er jo sådan set bare at få det til at virke med alle datoer, også dem der er fra før 01-01-1970...
Avatar billede nielle Nybegynder
25. juli 2006 - 20:27 #12
Prøv med:

date("d-m-Y", strtotime("+2 year", strtotime('1950-01-01')));
Avatar billede Slettet bruger
25. juli 2006 - 20:27 #13
Med mindre det er på Windows, så vil det virke umiddelbart med datoer helt tilbage til Fri, 13 Dec 1901 20:45:54 GMT ifølge http://dk.php.net/manual/da/function.date.php

Ellers er du nødt til at gøre det "manuelt", men hvis din dato er formateret lige som den, din date leverer, er det heller ikke svært.

$dato='27-01-1845';
list($d,$m,$a)=explode('-',$dato);
$a++;
if(2==$m && 29==$d){
  // 29/2 laver vi bare om til 28/2
  $d=28;
}
$nydato="$d-$m-$a";
Avatar billede Slettet bruger
25. juli 2006 - 20:33 #14
Hov, nu bad du jo om +2 år i selve teksten, selv om overskriften sagde +1 år. Så her er lige en funktion, som kan bruges lidt mere generelt:

function addyear($dato,$antal=1){
  $dato='27-01-1845';
  list($d,$m,$a)=explode('-',$dato);
  $a=$a+$antal;
  if(2==$m && 29==$d){
    // 29/2 laver vi bare om til 28/2
    $d=28;
  }
  return "$d-$m-$a";
}

Den kan bruges på to måder:

$nydato = addyear($gammeldato); // lægger et år til
$nydato = addyear($gammeldato, 2); // lægger to år til
Avatar billede Slettet bruger
25. juli 2006 - 20:33 #15
Og så skal linien med $dato='27-01-1845'; i koden naturligvis fjernes.
Avatar billede myst1098 Nybegynder
25. juli 2006 - 21:01 #16
Sandbox >

Super !

Din løsning er perfekt, så svar lige :o
Avatar billede myst1098 Nybegynder
25. juli 2006 - 21:06 #17
Ahhh... Den holder ikke helt for den springer jo generelt 29-02 over. Så hvis startdatoen er 29-02-2008 bliver samtlige datoer efterfølgende til 28-08. Også 2012 hvor det er skudår igen..
Avatar billede nielle Nybegynder
25. juli 2006 - 21:08 #18
Altid rart med lidt tilbagemelding - virker 25/07-2006 20:27:12 eller ej?

Har desværre ikke lige selv adgang til en PHP-installation i øjeblikket.
Avatar billede Slettet bruger
25. juli 2006 - 21:39 #19
Det er korrekt, at den tager ikke komplet hensyn til skudår. Det er fordi koden først blev skrevet til kun at håndtere at lægge et enkelt år til (og et enkelt år efter den 29/2 er det ikke skudår ;-)

function addyear($dato,$antal=1){
  list($d,$m,$a)=explode('-',$dato);
  $a=$a+$antal;
  if(2==$m && 29==$d){
    if(!(0==$a % 4 && 0 != $a % 400)){ // skudår når år er deleligt med 4 men ikke med 400
      // Det er IKKE skudår nu, så dato sættes til 28
      $d=28;
    }
  }
  return "$d-$m-$a";
}
Avatar billede Slettet bruger
25. juli 2006 - 21:41 #20
nielle: Uden at afprøve lige nu, så ja og nej. På en Unix/Linux og andet virker den. På Windows virker den ikke da Windows ignorerer fortegnsbitten i den 32-bit signed integer, den benytter til tidsværdier.
Avatar billede myst1098 Nybegynder
26. juli 2006 - 00:08 #21
nielle >

Hos mig viser dit eksempel 01-01-1972
Avatar billede Slettet bruger
26. juli 2006 - 00:29 #22
Ups: Jeg havde lavet ged i skudårsbetingelsen.

Det er skudår
hvis året er deleligt med 4
  men ikke hvis året er deleligt med 100
  men alligevel, hvis året er deleligt med 400

Dermed skal koden se således ud:

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";
}
Avatar billede Slettet bruger
26. juli 2006 - 00:59 #23
Og så fik jeg endda lavet ged igen, så den gav modsat resultat. Hvis den altså overhovedet havde kørt, for der var også en } for meget.

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";
}

Men så skulle der vist heller ikke være plads til flere behårede husdyr i den stump kode ;-)
Avatar billede myst1098 Nybegynder
26. juli 2006 - 15:10 #24
Super :o)

Jeg har faktisk et tillægsspørgsmål men det opretter jeg med nye point...
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