SImon: Zeit ausrechnen

Hi,

würde gerne bei Artikeln auf meiner Website anzeigen wann sie geschrieben wurden.
Und zwar so dass dort z.B. steht: vor 1 Woche hinzugefügt.

Da ich in einer Db das Datum speicher, wann ich den Artikel geschrieben habe dürfte dass ja kein Problem sein. Nur weiß ich nicht wie ich es machen soll dass dort nicht steht 21 min 12 sek sondern in diesen Schritten: 1-59 Min und dann nur mehr 1-23 Stunden, dann 1-6 Tage und dann 1-3 Wochen usw.

Kann mir da vielleicht jemand weiter helfen?

MfG
SImon

  1. Mahlzeit SImon,

    Da ich in einer Db das Datum speicher, wann ich den Artikel geschrieben habe dürfte dass ja kein Problem sein. Nur weiß ich nicht wie ich es machen soll dass dort nicht steht 21 min 12 sek sondern in diesen Schritten: 1-59 Min und dann nur mehr 1-23 Stunden, dann 1-6 Tage und dann 1-3 Wochen usw.

    Vorschlag: berechne Sekunden, Minuten, Stunden, Tage und Wochen, die seit dem Eintrag vergangen sind. Beispiele:

    30 Sekunden, 0.5 Minuten, 0.00833 Stunden, 0.00034 Tage, 0.00005 Wochen

    15480 Sekunden, 258 Minuten, 4.3 Stunden, 0.17917 Tage, 0.02560 Wochen

    2448900 Sekunden, 40815 Minuten, 680.25 Stunden, 28.34375 Tage, 4.04911 Wochen

    Jetzt fängst Du bei den Wochen an und gehst die einzelnen Werte der Reihenfolge nach durch, bist Du beim ersten Wert angekommen bist, der >= 1 ist. Diesen schreibst Du (samt seiner Einheit) hin.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo,

      Vorschlag: berechne Sekunden, Minuten, Stunden, Tage und Wochen, die seit dem Eintrag vergangen sind. Beispiele:
      [...]
      Jetzt fängst Du bei den Wochen an und gehst die einzelnen Werte der Reihenfolge nach durch, bist Du beim ersten Wert angekommen bist, der >= 1 ist. Diesen schreibst Du (samt seiner Einheit) hin.

      gute Idee, ich habe gerade an einem etwas schwerfälligeren Vorschlag geknobelt.
      Allerdings sollte man den berechneten Wert nicht "einfach so" hinschreiben, sondern vorher (ab)runden. Denn wenn da steht, "vor 4.04911 Wochen", sieht das etwas merkwürdig aus.

      Ciao,
       Martin

      --
      Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.
      Wer will meine haben? Denn ich will sie bstimmt nicht.
      1. Erstmals danke für die ganzen Antworten.

        Hab da nur ein paar probleme:

        wie kann ich 2 Timestamps von einander subtrahieren und wie kann ich eine Zahl aufrunden?

        MfG
        Simon

        1. Hallo Simon,

          wie kann ich 2 Timestamps von einander subtrahieren

          mit dem Subtraktionsoperator -

          $differenz = $aktuell - $damals;

          und wie kann ich eine Zahl aufrunden?

          Runden kannst Du mit round(), stets aufrunden mit ceil(), stets abrunden mit floor() (die beiden letzteren sind übrigens auf der Handbuchseite von round() verlinkt).

          Ich lege Dir intensiveren Umgang mit dem Handbuch (sei es PHP, sei es MySQL) ans Herz. Du wirst es Dir selber danken.

          Freundliche Grüße

          Vinzenz

          1. Ich lege Dir intensiveren Umgang mit dem Handbuch (sei es PHP, sei es MySQL) ans Herz. Du wirst es Dir selber danken.

            Ich weiß, und danke dass du mich daran wieder einmal erinnerst.

            Ich habs jetzt ansich geschaft, vielleicht extrem aber es funktioniert.
            Würde mich über Verbesserungsvorschläge freuen.

            Hier mal das Script:

             <?php  
              
            $aktuell = time();  
            $damals = "Daten aus DB";  
            $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(count($jahre) < 2)  
            	{  
            		$einheit = "Jahr";  
            	}  
            	else  
            	{  
            		$einheit = "Jahre";  
            	}  
            }  
            else  
            {  
            	if($monate >= 1)  
            	{  
            		$ergebnis = $monate;  
            		if(count($monate) < 2)  
            		{  
            			$einheit = "Monat";  
            		}  
            		else  
            		{  
            			$einheit = "Monate";  
            		}  
            	}  
            	else  
            	{  
            		if($wochen >= 1)  
            		{  
            			$ergebnis = $wochen;  
            			if(count(wochen) < 2)  
            			{  
            				$einheit = "Woche";  
            			}  
            			else  
            			{  
            				$einheit = "Wochen";  
            			}  
            		}  
            		else  
            		{  
            			if($tage >= 1)  
            			{  
            				$ergebnis = $tage;  
            				if(count($tage) < 2)  
            				{  
            					$einheit = "Tag";  
            				}  
            				else  
            				{  
            					$einheit = "Tage";  
            				}  
            			}  
            			else  
            			{  
            				if($stunden >= 1)  
            				{  
            					$ergebnis = $stunden;  
            					if(count($stunden) < 2)  
            					{  
            						$einheit = "Stunde";  
            					}  
            					else  
            					{  
            						$einheit = "Stunden";  
            					}  
            				}  
            				else  
            				{  
            					if($minuten >= 1)  
            					{  
            						$ergebnis = $minuten;  
            						if(count($minute) < 2)  
            						{  
            							$einheit = "Minute";  
            						}  
            						else  
            						{  
            							$einheit = "Minuten";  
            						}  
            					}  
            					else  
            					{  
            						if($sekunden >= 1)  
            						{  
            							$einheit = "sekunden";  
            							$ergebnis = $sekunden;  
            						}  
            					}  
            				}  
            			}  
            		}  
            	}  
            }  
              
              
            echo round($ergebnis);  
            echo $einheit;  
              
              
            ?>
            

            MfG
            Simon

  2. Hello,

    willst Du die Datenbank rechnen lassen?
    Welche hast Du im Einsatz?

    oder willst Du PHP rechnen lassen?
    Auf jeden Fall kannst Du Dir die Differenzzeit in Sekunden von der Datenbank ausgeben lassen.

    Je nach Datenbank gibt es dafür passende Funktionen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      willst Du die Datenbank rechnen lassen?

      ist mir eig egal.

      Welche hast Du im Einsatz?

      mysql

      MfG
      Simon

      1. Hello,

        Hello,

        willst Du die Datenbank rechnen lassen?
        ist mir eig egal.

        Welche hast Du im Einsatz?
        mysql

        Die Datenbank hat bei timediff() einen Bug gehabt. Ich weiß nicht, ob der schon beseitigt ist.

        Aber mit datediff() kannst Du die Anzahl der Tage ermitteln, die vergangen sind und mit time_to_sec() kannst Du die Sekunden des Zeitanteils des (angebrochenen) aktuellen Tages ermitteln.
        Das geht natürlich auch für die untere Schranke, also das Einstelldatum.

        Wie man Tage in Wochen umrechnet, weißt Du sicherlich

        Als Zwischenschritt ergeben sich die Sekunden seit Erstellung als

        set @seconds := datediff(now(), createdate) * 86400 - time_to_sec(createdate) + time_to_sec(now());

        oder als Select:

        select datediff(now(), createdate) * 86400 - time_to_sec(createdate) + time_to_sec(now()) seconds from messagetable where id = 1234;

        Voraussetzung ist, es hat zwischendurch keine Zeitumstellung stattgefunden.
        Wie genau musst Du das haben?

        Mit floor(), der Division und % (Modulo) und ein paar Uservariablen kannst Du Dir die Rechnung nun als Kettenrechnung aufbauen.

        Du kannst Dir die Abfrage soweit in der Datenbank ausformulieren, dass nachher der gewünschte Text herauskommt.

        Alternativ kannst Du dir natürlich auch die Sekunden zurückgeben lassen und die Rechnung in PHP auf ähnliche Weise durchführen. Das hätte dann den Vorteil, dass der Controller die Arbeit der Umrechnung übernimmt und die Datenbank entlastet ist. Außerdem stehen Dir dadurch auch die Ergebnisse in PHP zur Verfügung. Das ginge zwar auch mit der Datenbanklösung, ergäbe aber ein sehr komplexes Query mit vielen Funktionsaufrufen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de