Avatar billede langkiller Nybegynder
28. oktober 2010 - 00:37 Der er 15 kommentarer og
1 løsning

problem med visning af timestamp med date

Jeg har lavet en kode der skal fortælle hvor siden det er at brugeren har postet noget.. Det virker egentlig også næsten helt perfekt... bortset fra at når variablen $time_ago runder de 24 timer viser den 0 hours ago istedet for at udskrive 1 day ago...

den udskriver dog alligevel "1 day ago" når man ændre timestampet yderligere... men kan ikke rigtig finde ud af hvorfor den skriver "0 hours ago"..

Her er min kode i hvert fald:

$timestamp_sql = mysql_query("SELECT timestamp OSV ...");¨
$timestamp = mysql_result($timestamp_sql,0);

$time_ago = time() - $timestamp;

          if ($time_ago <= "59")
            { if ($time_ago == "1") { $time_ago = "1 second ago"; } else { $time_ago = date('U \s\e\c\o\n\d\s \a\g\o',$time_ago) ; } }

          elseif ($time_ago <= "119")
            { $time_ago = "1 minute ago"; }

            elseif ($time_ago <= "179")
              { $time_ago = "2 minutes ago"; }
            elseif ($time_ago <= "239")
              { $time_ago = "3 minutes ago"; }
            elseif ($time_ago <= "299")
              { $time_ago = "4 minutes ago"; }
            elseif ($time_ago <= "359")
              { $time_ago = "5 minutes ago"; }
            elseif ($time_ago <= "419")
              { $time_ago = "6 minutes ago"; }
            elseif ($time_ago <= "479")
              { $time_ago = "7 minutes ago"; }
            elseif ($time_ago <= "539")
              { $time_ago = "8 minutes ago"; }
            elseif ($time_ago <= "599")
              { $time_ago = "9 minutes ago"; }


          elseif ($time_ago <= "3599")
            { $time_ago = date('i \m\i\n\u\t\e\s \a\g\o',$time_ago) ; }

          elseif ($time_ago <= "86399")
            { if ($time_ago < "7199") { $time_ago = "1 hour ago"; } else { $time_ago = date('G \h\o\u\r\s \a\g\o',$time_ago); } }

          elseif ($time_ago <= "604799")
            { if ($time_ago < "172800") { $time_ago = "1 day ago"; } else { $time_ago = date('j \d\a\y\s \a\g\o',$time_ago) ; } }

          else
            { $time_ago = date('F j\, Y \a\t H:i',$timestamp); }
Avatar billede jannick281090 Nybegynder
28. oktober 2010 - 09:06 #1
<?php
    // mktime(hour,minute,second,month,day,year)
    $differTimeStamp = mktime(0,0,0,10,28,2019); // Den dato du vil sammenligne med
    $currentTimeStamp = time(); // Nuværende timestamp
   
    $difference = abs($differTimeStamp - $currentTimeStamp);
   
    $years  = floor($difference / (365*60*60*24));
    $months  = floor(($difference - $years * 365*60*60*24) / (30*60*60*24));
    $days    = floor(($difference - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
    $hours  = floor(($difference - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60));
    $minutes  = floor(($difference - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60);
    $seconds = floor(($difference - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minutes*60));
   
    $output = $years . " år, " . $months . " måneder, " . $days . " dage, " . $hours . " timer, " . $minutes . " minutter, " . $seconds . " sekunder";
    $outputDiffer = date("d-m-Y H:i:s", $differTimeStamp);
   
    if ($differTimeStamp > $currentTimeStamp) {
        $output .= " til " . $outputDiffer;
    }
    else {
        $output .= " siden " . $outputDiffer;
    }
   
    echo $output;
?>
Avatar billede majbom Novice
28. oktober 2010 - 09:39 #2
eller:

function getTimeDiff($time){
  $diff = time() - $time;
  $diff_arr = array();

  $diff_arr['days'] = (int) ($diff/86400);
  $diff_arr['hours'] = (int) (($diff/3600) % 24);
  $diff_arr['minutes'] = (int) (($diff / 60) % 60);
  $diff_arr['seconds'] = (int) ($diff % 60);

  return $diff_arr;
}

function timeAgo($diff_arr){
  if($diff_arr['days']>0){
      $output = $diff_arr['days'] . " dage";
  }else if($diff_arr['hours']>0){
      $output = $diff_arr['hours'] . " timer";
  }else if($diff_arr['minutes']>0){
      $output = $diff_arr['minutes'] . " minutter";
  }else{
      $output = $diff_arr['seconds']. " sekunder";
  }   

  return $output;
}
   
$timestamp = mktime(8, 43, 34, 10, 27, 2010);
$time_ago = timeAgo(getTimeDiff($timestamp));
   
echo "Det er $time_ago siden denne besked blev postet";
Avatar billede langkiller Nybegynder
28. oktober 2010 - 12:16 #3
Tak for jeres svar, men søger mere et svar på det jeg spurgte om eller en løsning på det problem jeg har med mit eget script.. sidder og eksperimenterer lidt med noget nemlig så kan ikke bruge et færdigskrevet script..
Avatar billede webweaver Praktikant
28. oktober 2010 - 15:30 #4
Kan være fordi at klokken 00 og 24 er det samme.
Så hvis du har H i din kode (som viser fra 00 - 24), så skift det til G, som viser fra 1 - 24. Det skal være store bogstaver.
Avatar billede jannick281090 Nybegynder
28. oktober 2010 - 15:56 #5
Det var jo netop lige det du spurgte om jeg kom med et færdigt script til du kan vel bare rette det til efter dine behov, da du nok ikke har brug for at udskrive hvor mange år det er siden en bruger sidst har postet?
Avatar billede langkiller Nybegynder
28. oktober 2010 - 20:28 #6
Webweaver jeg har allerede G i min date funktion.
Går ud fra at problemet ligger i disse linjer:

elseif ($time_ago <= "86399")
{
  if ($time_ago < "7199")
  {
  $time_ago = "1 hour ago";  // dette er bare til for at der ikke skal stå 1 hours (altså 1 timer)
  }
  else
  {
  $time_ago = date('G \h\o\u\r\s \a\g\o',$time_ago);
}

}
Avatar billede webweaver Praktikant
28. oktober 2010 - 21:55 #7
Ahh prøver du at skrive hours ago som tekst inde i din date?
Det kan du ikke. Lille h betyder fx også noget i date funktionen. Den vil returnere timer i 12 timers format.

Så skal du istedet skrive;

$time_ago = date("G", $time_ago) . "hours ago";

eller er det mig som misforstår?
Avatar billede langkiller Nybegynder
28. oktober 2010 - 22:40 #8
Jo lige præcis det jeg vil ;) Havde bare forstået at man skulle tilføje tekst til date på den måde..

Det ændrede dog ikke på noget at at skrive det efter date parenteserne.. får stadig udskrevet "0 hours ago" samme sted ..

Det virker fint med sekunder, minutter og timer indtil det punkt lige før det skal skifte til "day(s)"..
Avatar billede webweaver Praktikant
29. oktober 2010 - 12:09 #9
Hvis du udskriver $time_ago nede ved problemet, hvilket værdi indeholder variablen så der?
Avatar billede langkiller Nybegynder
29. oktober 2010 - 12:46 #10
så udskriver den 83504
Avatar billede langkiller Nybegynder
29. oktober 2010 - 13:05 #11
Prøvede lige at sætte tallet ind i date funktionen et helt andet sted end scriptet.. der udskriver den også 0 hours ago

print date('G',83504) . "hours ago";
Avatar billede webweaver Praktikant
29. oktober 2010 - 14:57 #12
Ahh jamen så tror jeg at jeg er med.

Det er klart at du får 0 ud.
Det tal du har det er et Unix Epoch tal. Det vil sige, det er antal sekunder fra 1. januar 1970. Hvis du regner det ud, så svarer 83504 til 2/1/1970 - 0.11.44. (bemærk klokken. Første er timer, og er 0)

Du bruger det forkert. Du ser det bare som hvor mange sekunder det er, fra brugeren har postet noget. Og der svarer 83504 til 23,19 timer ca.

Du kan ikke bruge date på den måde du vil.
Der må du istedet sige

$time_ago = (83504 / 60) / 60 . "hours ago";
Avatar billede langkiller Nybegynder
29. oktober 2010 - 20:19 #13
Aahh jo, du har ret. er helt med nu
date er jo fuldstændig unødvendig så. :)

Mange tak for hjælpen WW ! Smid et svar hvis du er interesseret i points
Avatar billede webweaver Praktikant
29. oktober 2010 - 20:41 #14
Ja det er den nemlig :)

Glad for at kunne hjælpe.

God weekend og tak for point :)
Avatar billede jannick281090 Nybegynder
30. oktober 2010 - 02:33 #15
Hvilket er præcist det samme som det stykke kode jeg gav dig, men whatever..
Avatar billede langkiller Nybegynder
30. oktober 2010 - 16:31 #16
Lige over WW ! ;)

- Jo det kan jeg godt se nu Jannick.. Men det jeg søgte var mere at få en forklaring eller en bedre forståelse af hvordan man skulle gribe sådan noget an da jeg ikke rigtig har arbejdet med timestamps osv. før
.. Kunne helt sikkert også have brugt din kode, men havde bare ikke fået lige så meget ud af det tror jeg. Sætter pris på at du prøvede at hjælpe!
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