Zeit ausrechnen
SImon
- php
0 EKKi0 Der Martin
0 Simon0 Vinzenz Mai0 Simon
0 Tom
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
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
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
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
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
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
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
Hello,
willst Du die Datenbank rechnen lassen?
ist mir eig egal.
Welche hast Du im Einsatz?
mysql
MfG
Simon
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