Getan vor: x Jahren x Monaten x Tagen x Stunden und x Minuten
bla
- php
Hallo.
Bisher wurde bei mir auf der Seite immer Datum und Uhrzeit angezeigt.
Nun möchte ich das man sieht wie lange der Beitrag her ist.
Hier meine Funktion
/**
* Letzter Post vor... x Jahre X Monate X Tage X Stunden X Minuten
*/
public static function doneUntil($timestamp){
// Vars
$year=31557600000;
$month=2592000000;
$day=86400000;
$hour=3600000;
$minute=60000;
$atm=time();
$dif=$atm-strtotime($timestamp);
$result='';
// Jahre
$x=round($dif/$year);
if($x>=1){
$result.=$x.(($x===1)?' Jahr':' Jahren');
$dif=$dif-$x*$year;
}
// Monate
$x=round($dif/$month);
if($x>=1){
$result.=$x.(($x===1)?' Monat':' Monaten');
$dif=$dif-$x*$month;
}
// Tage
$x=round($dif/$day);
if($x>=1){
$result.=$x.(($x>1)?' Tagen':' Tag');
$dif=$dif-$x*$day;
}
// Stunden
$x=round($dif/$hour);
if($x>=1){
$result.=$x.(($x>1)?' Stunden':' Stunde');
$dif=$dif-$x*$hour;
}
// Minuten
$x=round($dif/$minute);
if($x>=1){
$result.=$x.(($x>1)?' Minuten':' Minute');
$dif=$dif-$x*$minute;
}
return $result;
}
Allerdings kommen völlig falsche Werte raus.
Die Timestamps kommen aus einer PostgreSQL Datenbank - im TIMESTAMP WITHOUT TIMEZONE Format.
Gruß, Bla
$year=31557600000; $month=2592000000; $day=86400000; $hour=3600000; $minute=60000;
Rechnest Du in Millisekunden?
Grüße, Tibor
Rechnest Du in Millisekunden?
OH MEIN GOTT ICH TROTTEL!!!!
Wie Vollidiot kann man nur sein..
So jetzt in Sekunden:
$year=31536000;
$month=2419200;
$day=86400;
$hour=3600;
$minute=60;
Funktioniert aber trotzdem nicht.
Funktioniert aber trotzdem nicht.
Hast Dii Dir mal den Wert für "strtotime($timestamp)" ausgeben lassen?
Hi,
ich hab da mal sowas geschrieben ^^, ist aber schon lange her, und habe es auch nie überarbeitet. Ich würde es dir persönlich auch nicht empfehlen.
$aktuell = time();
$differenz = $aktuell - $damals;
$sekunden = $differenz;
$minuten = $differenz / 60;
$stunden = $differenz / 3600;
$tage = $differenz / 86400;
$wochen = $differenz / 604800;
$monate = $differenz / 18144000;
$jahre = $differenz / 31536000;
if($jahre >= 1)
{
$ergebnis = $jahre;
if(round($jahre) < 2)
{
$einheit = "Jahr";
}
else
{
$einheit = "Jahren";
}
}
else
{
if($monate >= 1)
{
$ergebnis = $monate;
if(round($monate) < 2)
{
$einheit = "Monat";
}
else
{
$einheit = "Monaten";
}
}
else
{
if($wochen >= 1)
{
$ergebnis = $wochen;
if(round($wochen) < 2)
{
$einheit = "Woche";
}
else
{
$einheit = "Wochen";
}
}
else
{
if($tage >= 1)
{
$ergebnis = $tage;
if(round($tage) < 2)
{
$einheit = "Tag";
}
else
{
$einheit = "Tagen";
}
}
else
{
if($stunden >= 1)
{
$ergebnis = $stunden;
if(round($stunden) < 2)
{
$einheit = "Stunde";
}
else
{
$einheit = "Stunden";
}
}
else
{
if($minuten >= 1)
{
$ergebnis = $minuten;
if(round($minuten) < 2)
{
$einheit = "Minute";
}
else
{
$einheit = "Minuten";
}
}
else
{
if($sekunden >= 1)
{
$einheit = "Sekunden";
$ergebnis = $sekunden;
}
else
{
if($differenz == 0)
{
$einheit = "Sekunde";
$ergebnis = "1";
}
}
}
}
}
}
}
}
MfG
Simon
Hi,
Bisher wurde bei mir auf der Seite immer Datum und Uhrzeit angezeigt.
Nun möchte ich das man sieht wie lange der Beitrag her ist.
bist du sicher, dass du das willst? Ist natürlich deine Entscheidung, aber ich finde eine Angabe wie "am 11.08.2005" wesentlich einfacher zu begreifen als "vor 4 Jahren, 4 Monaten und 3 Tagen".
$year=31557600000; $month=2592000000; $day=86400000; $hour=3600000; $minute=60000;
Okay, die Umstellung auf Sekunden setze ich mal voraus.
$atm=time(); $dif=$atm-strtotime($timestamp);
Hast du geprüft, of $dif hier richtig berechnet wird, dein $timestamp also richtig interpretiert wird?
$x=round($dif/$year); if($x>=1){ $result.=$x.(($x===1)?' Jahr':' Jahren');
Warum vergleichst du hier typgenau? Die Konstante 1 ist ein Integer-Typ, round() gibt aber einen Fließkomma-Typ zurück. Der typgenaue Vergleich wird niemals true ergeben.
$result.=$x.(($x===1)?' Monat':' Monaten');
Dito.
$result.=$x.(($x>1)?' Tagen':' Tag');
Das ist besser.
Allerdings kommen völlig falsche Werte raus.
Gib mal ein, zwei Beispiele. Denn abgesehen von den nicht erfüllbaren Vergleichen (die ja nur über Einzahl/Mehrzahl in der Ausgabe entscheiden) finde ich nichts, was hier offensichtlich falsch ist.
Die Timestamps kommen aus einer PostgreSQL Datenbank - im TIMESTAMP WITHOUT TIMEZONE Format.
Was bedeutet das? Wie ist dieses Format definiert?
So long,
Martin
Jetzt funkioniert sie aber ich habe ein anderes Problem.
Aufm Localhost funktioniert sie. Auf dem Server nicht.
Gleiche Formate. Hab schon alles verglichen =(
Keine Fehlermeldung - nichts.
Hi,
Jetzt funkioniert sie aber ich habe ein anderes Problem.
Aufm Localhost funktioniert sie. Auf dem Server nicht.
Gleiche Formate. Hab schon alles verglichen =(Keine Fehlermeldung - nichts.
Dann beginne mit - dem Debugging.
Erst mal checken, dass error_reporting auf E_ALL steht, und sich auch irgendwo bemerkbar macht (display_errors bzw. error_log).
Wenn dabei noch nichts herauskommt - dann mal Kontrollausgaben interessanter Variablen im Scriptverlauf machen.
MfG ChrisB
hi,
Allerdings kommen völlig falsche Werte raus.
Logisch, weil
$year=31557600000;
$month=2592000000;
diese Anzahl an Sekunden nicht stimmt.
Hotti
Es funktioniert doch nicht. Weder Localhost noch auf dem Server:
$year=31536000;
$month=18144000;
$day=86400;
$week=604800;
$hour=3600;
$minute=60;
$dif=round(time()-strtotime($timestamp))*(-1);
$result='';
// Jahre
$x=round($dif/$year);
if($x>=1){
$result.=$x.(($x==1)?' Jahr ':' Jahren ');
$dif=$dif-$x*$year;
}
// Monate
$x=round($dif/$month);
if($x>=1){
$result.=$x.(($x==1)?' Monat ':' Monaten ');
$dif=$dif-$x*$month;
}
// Tage
$x=round($dif/$day);
if($x>=1){
$result.=$x.(($x>1)?' Tagen ':' Tag ');
$dif=$dif-$x*$day;
}
// Stunden
$x=round($dif/$hour);
if($x>=1){
$result.=$x.(($x>1)?' Stunden ':' Stunde ');
$dif=$dif-$x*$hour;
}
// Minuten
$x=round($dif/$minute);
if($x>=1){
$result.=$x.(($x>1)?' Minuten':' Minute');
$dif=$dif-$x\*$minute;
}
return $result;
strtotime($timestamp) gibt mir z.b. aus:
1260623398
Hallo,
Es funktioniert doch nicht. Weder Localhost noch auf dem Server:
was haben deine bisherigen Untersuchungen ergeben?
strtotime($timestamp) gibt mir z.b. aus:
1260623398
Und - ist das richtig? Das entspricht dem 12.12.2009 ungefähr 14.10 Uhr.
$dif=round(time()-strtotime($timestamp))\*(-1);
Was soll diese putzige Rechnung? Was versprichst du dir davon, a) die Differenz zweier Timestamps, die sowieso ganzzahlig ist, nochmal durch round() zu nudeln? Und b) sie danach negativ zu machen?
Ciao,
Martin
Hi bla,
hast Du schon darüber nachgedacht, dass alle Deine "round" falsch sein könnten? ;-)
Wenn "round" kaufmännisch rundet (und das tut es IMHO), wird das Fehler verursachen.
Schonmal über ceil/floor nachgedacht und welches der Beiden für Dich das Richtige wäre?
Tibor
Wenn "round" kaufmännisch rundet (und das tut es IMHO), wird das Fehler verursachen.
$x=round($dif/$year);
Wenn hier 9.5 auf 10 gerundet wird, dann ...
»» if($x>=1){
»» $result.=$x.(($x===1)?' Jahr':' Jahren');
.... hier gute Nacht ;-)
»» $dif=$dif-$x*$year;
Immernoch nicht:
// Vars
$year=31536000;
$month=18144000;
$day=86400;
$week=604800;
$hour=3600;
$minute=60;
$dif=time()-strtotime($timestamp);
$result='';
// Jahre
$x=ceil($dif/$year);
if($x>=1){
$result.=$x.(($x==1)?' Jahr ':' Jahren ');
$dif=$dif-$x*$year;
}
// Monate
$x=ceil($dif/$month);
if($x>=1){
$result.=$x.(($x==1)?' Monat ':' Monaten ');
$dif=$dif-$x*$month;
}
// Tage
$x=ceil($dif/$day);
if($x>=1){
$result.=$x.(($x>1)?' Tagen ':' Tag ');
$dif=$dif-$x*$day;
}
// Stunden
$x=ceil($dif/$hour);
if($x>=1){
$result.=$x.(($x>1)?' Stunden ':' Stunde ');
$dif=$dif-$x*$hour;
}
// Minuten
$x=ceil($dif/$minute);
if($x>=1){
$result.=$x.(($x>1)?' Minuten':' Minute');
$dif=$dif-$x*$minute;
}
return $result;
Das das eine Datum haut ungefähr hin. Aber jetzt zeigt er mir wenigstens mal etwas an : 1 Jahr. Aber das stimmt ja nicht. 12.12.09 haut ja hin.
Immernoch nicht:
Da steht ja auch immer noch
ceil
drinne ;-)
Sagte ich nicht, Du sollst schauen, welches für Dich das RICHTIGE ist? ;-)
ceil ist es jedenfalls nicht!
... hätte ich Dir die Lösung nicht verraten und Du säßest heut noch kopfschüttelnd vor Deinem Problem.
Ganz sicher, junger Freund ;-)
... hätte ich Dir die Lösung nicht verraten und Du säßest heut noch kopfschüttelnd vor Deinem Problem.
Ganz sicher, junger Freund ;-)
Lieber Tiber, leider klappt es immernoch nicht.
Ich kann aber gerade nicht auf dieses Problem eingehen da ich morgen und übermorgne noch zwei Klausuren schreibe. Chemie und Geschichte LK =/.
Melde mich also Donnerstag wieder!
... hätte ich Dir die Lösung nicht verraten und Du säßest heut noch kopfschüttelnd vor Deinem Problem.
Ganz sicher, junger Freund ;-)
Lieber Tiber, leider klappt es immernoch nicht.
Ich kann aber gerade nicht auf dieses Problem eingehen da ich morgen und übermorgne noch zwei Klausuren schreibe. Chemie und Geschichte LK =/.
Melde mich also Donnerstag wieder!
Ich sag ja: "Junger Freund" ;-))
Lieber Tiber, leider klappt es immernoch nicht.
Und doch: Es läuft. Ganz sicher! Jadenfalls, wenn Du meine Tips umgesetzt hast.
Toi, toi bei den Klausuren.
Tibor
Hi!
Bisher wurde bei mir auf der Seite immer Datum und Uhrzeit angezeigt.
Nun möchte ich das man sieht wie lange der Beitrag her ist.
Wenn dir schon PHP 5.3 zur Verfügung steht, kannst du den Aufwand drastisch senken. Denn dann gibt es in der DateTime-Klasse die Methode diff(). Das Ergebnis ist ein DateInterval, das man nur noch formatiert ausgeben muss.
Ansonsten kannst du schauen, ob es PEAR auf deinem Server gibt, da gibt es vergleichbare Funktionen.
Lo!