Avatar billede i-jinx-u Nybegynder
08. november 2009 - 00:44 Der er 10 kommentarer og
1 løsning

Hjælp til relativ tid function

Hej eksperter..

Jeg er igang med at lave et meget lille forum ovre i skolen og sidder og arbejder med det herhjemme.

Når folk poster kommentarer til et indlæg vil jeg ikke have der skal vises en dato for hvonår den blev skrevet men mere "twitter-agtigt" med noget relativ tid.. Såsom "Postet for 4 minutter siden" og feks "Postet for 3 dage siden" og minutter osv.

Lidt hen i stil med det her:


function relativeDate($timestamp, $days = false, $format = "M j, Y") {

  if (!is_numeric($timestamp)) {
    // It's not a time stamp, so try to convert it...
    $timestamp = strtotime($timestamp);
  }

  if (!is_numeric($timestamp)) {
    // If its still not numeric, the format is not valid
    return false;
  }

  // Calculate the difference in seconds
  $difference = time() - $timestamp;

  // Check if we only want to calculate based on the day
  if ($days && $difference < (60*60*24)) {
    return "Today";
  }
  if ($difference < 3) {
    return "Just now";
  }
  if ($difference < 60) {   
    return $difference . " seconds ago";
  }
  if ($difference < (60*2)) {   
    return "1 minute ago";
  }
  if ($difference < (60*60)) {
    return intval($difference / 60) . " minutes ago";
  }
  if ($difference < (60*60*2)) {
    return "1 hour ago";
  }
  if ($difference < (60*60*24)) {   
    return intval($difference / (60*60)) . " hours ago";
  }
  if ($difference < (60*60*24*2)) {
    return "1 day ago";
  }
  if ($difference < (60*60*24*7)) {
    return intval($difference / (60*60*24)) . " days ago";
  }
  if ($difference < (60*60*24*7*2)) {
    return "1 week ago";
  }
  if ($difference < (60*60*24*7*(52/12))) {
    return intval($difference / (60*60*24*7)) . " weeks ago";
  }
  if ($difference < (60*60*24*7*(52/12)*2)) {
    return "1 month ago";
  }
  if ($difference < (60*60*24*364)) {
    return intval($difference / (60*60*24*7*(52/12))) . " months ago";
  }

  // More than a year ago, just return the formatted date
  return @date($format, $timestamp);

}


Problemet med ovenstående er simpelthen at jeg ikke ved hvordan jeg integrerer det i mit script..

Dog har jeg prøvet at gøre dette:


<?php

    if(isset($_POST['submit'])) {
       
        $fornavn = mysql_real_escape_string($_POST['fornavn']);
        $efternavn = mysql_real_escape_string($_POST['efternavn']);
        $date = date('d/m/y H:i:s');
       
        $q = mysql_query("INSERT INTO names (firstname, lastname, date) VALUES ('$fornavn', '$efternavn', '$date')")
        or die (mysql_error());

    }

?>
<?php

    $q = mysql_query("SELECT * FROM names ORDER BY date DESC")
    or die (mysql_error());
   
    while ($r = mysql_fetch_array($q)) {
       
        $date = relativeDate(strtotime(date("$r[date]")));
   
        echo "<a href=\"slet.php?id=$r[id]\">Slet</a><br />";
        echo "$r[firstname] $r[lastname]<br />";
        echo "$date<br /><br />";
   
    }

?>


- Men så siger den hele tiden "2 months ago" selvom den bliver postet med det samme?! :-S

Håber på noget hjælp..

Tak på forhånd :-)
Avatar billede caspersch Nybegynder
08. november 2009 - 00:56 #1
Fejlen kan enten ligge funktionen, eller i det data du smider i den. Prøv med forskellige timestamps minus x antal sekunder, så kan du teste om funktionen virker. Brug eksempelvis time()-3601 eller time()-(24x3600x10) så skulle du gerne få nogle forskellige resultater.

I overstående tilfælde så ville jeg gemme tidspunktet for oprettelse som timestamp (der hvor du brugger $date = date('d/m/y H:i:s');) husk at ændre det i databasen.

Det vil gøre det hele meget nemmere. Der er ikke nogen grund til at gemme i et format, og konventere om til et andet format, som du lægger op til.

Held og lykke med det!
Avatar billede i-jinx-u Nybegynder
08. november 2009 - 01:04 #2
Tak for svaret, det var hurtigt..

Men så snart jeg ændrer det til timestamp i db'en, så kommer der dato, tid osv ud og ikke noget fra funktionen mere.

Og lige mht. time()- du skriver, det forstår jeg ikke, skal jeg rette det oppe i funktionen?
Avatar billede i-jinx-u Nybegynder
08. november 2009 - 01:07 #3
For når jeg oppe i funktionen ændrer det til

$difference = time()-(24*3600*10) - $timestamp;


Så står der 11 months ago..
Avatar billede caspersch Nybegynder
08. november 2009 - 01:34 #4
Du skal poste time() til et felt i databasen.
Hiv feltet ud og smid og smid i din funktion.

Det med time()-xxx var en måde du kunne teste om funktionen virkede rigtigt.
Avatar billede i-jinx-u Nybegynder
08. november 2009 - 02:59 #5
Fandt selv ud af det, skulle simpelthen bare skifte d/m/y til m/d/y.. Ellers mange mange tak :)
Avatar billede i-jinx-u Nybegynder
08. november 2009 - 03:10 #6
Svar :)
Avatar billede caspersch Nybegynder
08. november 2009 - 09:23 #7
Det er stadigvæk en molbo løsning at gøre det på den måde... hvorfor gemme tiden i et format, når du skal konventere det om igen? Efter min mening er det rigtig dårlig kode/programmering.

Den eneste grund til skulle gemme dataene på den måde som du gør, er hvis du hver gang skal hive feltet ud, uden at behandle det på nogen måde. Og det er jo ikke tilfældet her.

Simplificeret:
Din funktion skal bruge format a & du kan gemme i format a.
Du gemmer i format b - af en eller anden mærkelig grund.
Du hiver data ud, og blive nød til at konventere om til format a
Avatar billede BrJoe Nybegynder
08. november 2009 - 21:27 #8
Så må du jo fortælle mig hvad jeg skal gøre, da det er det jeg har problemer med.
Avatar billede caspersch Nybegynder
08. november 2009 - 22:03 #9
Jeg syntes næste ikke jeg kan udpensle det mere: kodeeksempel:

$q = mysql_query("INSERT INTO names (firstname, lastname, date) VALUES ('$fornavn', '$efternavn', time()")

og så:

  while ($r = mysql_fetch_array($q)) {
     
        $date = relativeDate($r[date]);

Det kræver du ændre data feltet i databasen.
Avatar billede BrJoe Nybegynder
09. november 2009 - 01:01 #10
Ah okay, '". time() ."')").. <- Det hjalp, havde prøvet så mange gange med time() og den blev ved med at komme med fejl, men man skal jo lige huske at skrive det ordenligt :) Tak for det og tak for din tid, det sætter jeg sku pris på!
Avatar billede caspersch Nybegynder
09. november 2009 - 18:44 #11
Personligt gemmer jeg altid i time() format - det syntes jeg er den nemmeste måde at arbejde på! Det var godt - når du får dit website op og stå, så kan du jo altid kigge på : http://avisabonnement-tilbud.dk/webmaster/
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