Avatar billede leshrac Nybegynder
07. april 2007 - 16:48 Der er 18 kommentarer og
1 løsning

date diff hvordan?

$date1 er 2007-04-05
$date2 er 2007-04-09

hvordan laver jeg en beregning der beregner differancen mellem de to variabler?
Avatar billede showsource Seniormester
07. april 2007 - 16:58 #1
$days = ((str_replace("-", $date2))-(str_replace("-", $date1)));

tror jeg.....
Avatar billede nixir Nybegynder
07. april 2007 - 16:58 #2
Jeg ville for det første havet gemt $date1 og $date2 som timestamps (vha. time()) og så formaterer resultatet bagefter ...

Men med den metode du har valgt, synes jeg du bør lave en funktion der ordner det hvis det skal gøres flere gange.

Ellers så det du skal have dat i noget der kan splitte de to variabler op i 3 ... derefter skal år trækkes fra år, måned trækkes fra måned og dag trækkes fra dag...

$date1 = '2007-04-05';
$date2 = '2007-04-09';

list($year1, $month1, $day1) = split('-', $date1);
list($year2, $month2, $day2) = split('-', $date2);

$year_diff = $year1 - $year2;
$month_diff = $month1 - $month2;
$day_diff = $day1 - $day2;

$diff = $year_diff.'-'.$month_diff.'-'.$day_diff;

Det burde virke ...
Avatar billede showsource Seniormester
07. april 2007 - 16:59 #3
Men har du dem i DB?
SELECT DATEDIFF(felt2, felt1) as dage FROM tabel
Avatar billede nixir Nybegynder
07. april 2007 - 17:02 #4
som funktion ville det så se sådan ud:

function date_diff($date1,$date2) {
  list($year1, $month1, $day1) = split('-', $date1);
  list($year2, $month2, $day2) = split('-', $date2);

  $year_diff = $year1 - $year2;
  $month_diff = $month1 - $month2;
  $day_diff = $day1 - $day2;

  $diff = $year_diff.'-'.$month_diff.'-'.$day_diff;
  return $diff;
}

Den burde virke - men har ikek testet den igennem ... bare skrevet i hånden
Avatar billede nixir Nybegynder
07. april 2007 - 17:12 #5
Den funktion jeg lavede ville give dig forskellen i år-måneder-dage og ikke i antal dage .. hvis du vil have antal dage har jeg et andet løsningsforslag:

Du kan bruge mk_time() ... Den laver et timestamp ud fra din dato...

så brug mk_time() på dato 1 og 2 (2 forskellige funktioner) ...
Du får nu to 10-cifrede tal (eller lign). Det er antal sekunder fra 1. juni 1970 eller lign ... (igen er jeg ikke sikker på historien) ... hvis du trække de to tal fra hianden får du antal sekunder imellem.

Antal sekunder / 60 = antal minutter
. / 60 = antal timer
. / 24 = antal dage
Avatar billede leshrac Nybegynder
07. april 2007 - 17:15 #6
jeg hælder mest til det sidste forslag... jjeg prøver lige at lege lidt med det :)
Avatar billede nixir Nybegynder
07. april 2007 - 17:17 #7
Min fejl .. den hedder sku mktime() ud i et ..

ved at bruge min funktion fra før kan jeg lave:
function date_diff($date1,$date2) {
  list($year1, $month1, $day1) = split('-', $date1);
  list($year2, $month2, $day2) = split('-', $date2);

  $date1_timestamp = mktime ( 0, 0, 0, $month1, $day1, $year1);
  $date2_timestamp = mktime ( 0, 0, 0, $month2, $day2, $year2);

  $diff = ($date2_timestamp - $date1_timestamp) / 60 / 60 / 24;
  return $diff;
}

Den kan du også prøve hvis det er - du kan også pille det ud af funktionen hvis du bedre kan lide det sådan ...
Avatar billede nixir Nybegynder
07. april 2007 - 17:18 #8
Men igen ... Det er lavet ret hurtigt .. kan godt ha glemt noget .. du ved hvordan det er..

Skriv hvis det ikke virker ...
Avatar billede kring Nybegynder
07. april 2007 - 17:19 #9
Sådan som jeg forstår de 2 første metoder der er blevet forslået, vil ingen af dem virke.

showsource's metode:
$date1 = 2006-12-31
$date2 = 2007-01-01

$days = ((str_replace("-", $date2))-(str_replace("-", $date1)));
8870 = 20070101 - 20061231

nixir's metode:

$year1= 2006
$month1 = 12
$day1 = 31

$year2= 2007
$month2 = 1
$day2 = 1

$year_diff = 2006 - 2007;
$month_diff = 12 - 1;
$day_diff = 31 - 1;

$diff = -1 - 11 - 30

Nixir's sidste metode har jeg ikke testet.

Jeg vil forslå dig at kigge på nogle af de forslag, der er under User Contributed Notes på http://www.php.net/datetime
Avatar billede nixir Nybegynder
07. april 2007 - 17:28 #10
Sorry kring :)

kan godt se hvad du mener .. for det første har jeg byttet om på date 1 og 2 ... for det andet vil dit eksempel (hvis man bytter om) vise hvordan det ikke virker... den mangler muligheden for at trække måneder fra hvis dagene der skal trækkes fra får det til at gå i minus...

Men min sidste metode burde være i orden ... tror faktisk der er en funktion der kan trække timestamps fra hianden ... men det her virker også ;)
Avatar billede mtrolle Nybegynder
07. april 2007 - 19:06 #11
Simpelt:

$diff = strtotime($date2)-(strtotime($date1);
//$diff indeholder nu forskellen i sekunder. Regnes her om til døgn:
$diff = $diff/86400;

echo 'Der er gået ' . $diff . ' døgn mellem ' . $date1 . ' og ' . $date2;
Avatar billede mtrolle Nybegynder
07. april 2007 - 19:10 #12
Hov, fik lige et ( for meget i første linje.

<?
$date1 = '2007-04-05';
$date2 = '2007-04-09';

$diff = strtotime($date2)-strtotime($date1);
//$diff indeholder nu forskellen i sekunder. Regnes her om til døgn:
$diff = $diff/86400;

echo 'Der er gået ' . $diff . ' døgn mellem ' . $date1 . ' og ' . $date2;
?>
Avatar billede showsource Seniormester
08. april 2007 - 07:04 #13
ehh, og jeg fik ikke det med som skal erstatte "-" :O()

$days = ((str_replace("-", "", $date2))-(str_replace("-", "", $date1)));

Og igen, hvis de ligger i DB, ville jeg nok gøre udregning ved udtræk.
Avatar billede mtrolle Nybegynder
08. april 2007 - 12:37 #14
>showsource,
Det kan ikke altid svare sig at lade MySQL lave beregningen, hvis man har en belastet database. I nogle tilfælde er det klart smartere at lave beregningen i PHP, men det kommer naturligvis meget an på, hvor vidt serveren er presset i bund.
Så i sidste ende er det et performence spørgsmål, om man vil lade MySQL bruge ressourcer på at udregne det, eller lade PHP gøre det.
Avatar billede nixir Nybegynder
08. april 2007 - 12:51 #15
Er jeg den eneste der føler spørgsmålet er besvaret x4 ;)

Synes mtrolle's er bedste løsning...:
$diff = strtotime($date2)-strtotime($date1);
$diff = $diff/86400;

Den er simpel, men ja - man kan overveje at lade databasen lave beregningen istedet. Giv nogle point til det du bruger...
Avatar billede leshrac Nybegynder
08. april 2007 - 12:57 #16
skal jeg nok Nixir...

gik i gang med noget andet da jeg ikke lige kunne overskue det :)

men kigger på det om en times tid.. syntes Mtrolles løsning virker overskuelig.. svaret kommer lige om en times tid... sorry for den lange tid :)
Avatar billede nixir Nybegynder
08. april 2007 - 13:30 #17
Det er bare i orden ... det var mere for at få tråden lukket - for det er vel ved at være rimelig uddebateret :P

$diff = strtotime($date2)-strtotime($date1);
$diff = $diff/86400;
eller rode lidt med den her hvis du henter fra db:
SELECT DATEDIFF(felt2, felt1) as dage FROM tabel

Men det lyder ikke som om du vil kunne mærke forskellen...
Avatar billede leshrac Nybegynder
08. april 2007 - 14:39 #18
Jeg bruger mtrolles men tak for engagementet nixir :)

Mvh
John Lajer
Avatar billede mtrolle Nybegynder
08. april 2007 - 17:15 #19
Takker for point.

//mtrolle
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