bla: Getan vor: x Jahren x Monaten x Tagen x Stunden und x Minuten

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

  1.   $year=31557600000;  
      $month=2592000000;  
      $day=86400000;  
      $hour=3600000;  
      $minute=60000;  
    

    Rechnest Du in Millisekunden?

    Grüße, Tibor

    1. Rechnest Du in Millisekunden?

      OH MEIN GOTT ICH TROTTEL!!!!
      Wie Vollidiot kann man nur sein..

      1. So jetzt in Sekunden:

        $year=31536000;
        $month=2419200;
        $day=86400;
        $hour=3600;
        $minute=60;

        Funktioniert aber trotzdem nicht.

        1. Funktioniert aber trotzdem nicht.

          Hast Dii Dir mal den Wert für "strtotime($timestamp)" ausgeben lassen?

  2. 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

  3. 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

    --
    "Gestern habe ich die Rede des Parteivorsitzenden gehört. Zwei Stunden lang!" - "Worüber?" - "Hat er nicht gesagt."
    1. 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.

      1. 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

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  4. hi,

    Allerdings kommen völlig falsche Werte raus.

    Logisch, weil
       $year=31557600000;
       $month=2592000000;

    diese Anzahl an Sekunden nicht stimmt.

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  5. 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

    1. 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

      --
      Schon gewusst, dass Aftershave trotz des Namens eigentlich eher fürs Gesicht gedacht ist?
      1. 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

        1. 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;

          1. 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.

            1. 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!

              1. ... hätte ich Dir die Lösung nicht verraten und Du säßest heut noch kopfschüttelnd vor Deinem Problem.

                Ganz sicher, junger Freund ;-)

                1. ... 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!

                  1. ... 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

  6. 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!