Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Zeitdifferenz    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
Andavos
Administrator
Foren-Gott


Dabei seit: 30.11.2003
Herkunft:
Posts: 6298
     Zeitdifferenz Zitat | Bearbeiten

So berechnet man die vergangene Zeit zwischen zwei Timestamps.

Wenn man zwei Timestamps hat, dann kann man ja sehr leicht die differenz zwischen diesen zwei Timestamps ermitteln.
Allerdings kann sich der Mensch unter 43200 Sekunden relativ wenig vorstellen.
Darum möchte man oft die Differenz in Minuten, Stunden, Tage usw. umwandeln.
Mit der Funktion date(); Funktioniert dieses nicht, denn diese rechnet nur den Timestamp seit dem 1.1.1970 in das Datum um.

Abhilfe schaft diese Funktion:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
<?php
function diff_time($differenz)
   {  
   
$tag  floor($differenz / (3600*24));
   
$std  floor($differenz 3600 24);
   
$min  floor($differenz 60 60);
   
$sek  floor($differenz 60);

   return array(
"sek"=>$sek,"min"=>$min,"std"=>$std,"tag"=>$tag,"woche"=>$woche);
   }

$differenz 1234567;
$differenz diff_time($differenz);

echo 
"1234567 Sekunden oder:<br>
"
.$differenz['tag']." Tage<br>
"
.$differenz['std']." Stunden<br>
"
.$differenz['min']." Minuten und<br>
"
.$differenz['sek']." Sekunden<br>";
?>


An die Funktion time_diff(); übergibt man die differenz zwischen 2 Timestamps.
In unserem Beispiel wäre die Differenz 1234567 Sekunden.

Als rückgabe erhalten wir ein Array mit den verschiedenen Werten.
Dazu werden folgende Schlüssel bentuzt:
tag: Vergangene Tage
std: Vergangene Stunden (unter Berücksichtigung von Tagen)
min: Vergangene Minuten (unter Berücksichtigung von Stunden)
sek: Die verleibenden Sekunden.

Die Funktion errechnet nicht die zurückliegenden Monate/Jahre, da sich die Anzahl der Tage immer ändert.


www.php-einfach.de, PHP lernen leicht gemacht
www.webhosterwissen.de, Webhosting-Vergleich





Post wurde schon 1x editiert, das letzte mal am 19.12.2006 um 16:46 von Andavos
03.10.2005, 18:42 Profil | PM | E-Mail  
Schneemann
Mitglied
Anfänger


Dabei seit: 28.04.2006
Herkunft: keine Angabe
Posts: 89
      Zitat | Bearbeiten

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

<?php
  
function timediff($syntax,$time) {
    
$h floor($time/3600);
    
$m floor($time/60)-$h*60;
    
$s $time-$m*60-$h*3600;
    
$syntax str_replace("h",$h,$syntax);
    
$syntax str_replace("m",$m,$syntax);
    
$syntax str_replace("s",$s,$syntax);
    return 
$syntax;
  }
?>


meine Variante. Funktioniert zwar nur mit Stunden,Minuten und Sekunden (also für kürzere Abstände) aber dafür kann man sie so benutzen:

 PHP 
1:
2:
3:
4:
5:

<?php
  $diff 
1234567;
  
timediff("h:m:s",$diff);
?>


Vielleicht könnte sich jmd die Mühe machen und beide Funktionweisen kombinieren


05.11.2006, 18:50 Profil | PM | E-Mail  
Valentin
Mitglied
Exzellenter User


Dabei seit: 25.10.2004
Herkunft:
Posts: 1092
      Zitat | Bearbeiten

Hallo,

du meinst so?

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

<?php
function timediff ($syntax,$differenz) {
   
$w floor($differenz / (3600*24*7));
   
$d floor($differenz / (3600*24) % 7);
   
$h floor($differenz 3600 24);
   
$m floor($differenz 60 60);
   
$s floor($differenz 60);

   
$syntax str_replace("w",$w,$syntax);
   
$syntax str_replace("d",$d,$syntax);
   
$syntax str_replace("h",$h,$syntax);
   
$syntax str_replace("m",$m,$syntax);
   
$syntax str_replace("s",$s,$syntax); 
}
?>

(Habs nicht getestet)

Aber irgend wie ist es auch unlogisch, denn wenn einer nicht die Wochen wissen will ist es blöd, man muss im Syntax dann schon alles angeben ....

MfG
V@lentin


Software ist die Lizenz zum Geld drucken.


Post wurde schon 1x editiert, das letzte mal am 05.11.2006 um 20:10 von Valentin
05.11.2006, 20:09 Profil | PM | E-Mail  
Andavos
Administrator
Foren-Gott


Dabei seit: 30.11.2003
Herkunft:
Posts: 6298
      Zitat | Bearbeiten

Orginal von [AxT] - Alexander
Diese Funktion soll euch helfen, Sekunden in Stunden, Minuten und Sekunden umzurechnen. Dies ist bei Zeitrechnungen mit PHP fasst immer erforderlich.
Zuerst die Function, die Sekunden in Stunden, Minuten und Sekunden umrechnet
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

<?php
function make_hmi($time)
{
    
$hours floor(($time 60) / 3600);
    
$minutes floor($time) - ($hours 60);
 
    
$seconds round(fmod($time 6060),0);
    return array(
'hours' => $hours'minutes' => $minutes'seconds' => $seconds);
}
?> 

Der Aufruf der Funktion erfolt wie folgt:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

<?php
// Hier im BSP sinds 60 Sec.
$time 60;

// FUNKTION AUFRUFEN
$time make_hmi($time);

echo 
$time['hours'].":".$time['minutes'].".".$time['seconds'];
// Die Ausgabe wäre dann: 0:1:0
?>


Nun die Funktion, die Stunden, Minuten und Sekunden in Sekunden umrechnet:
 PHP 
1:
2:
3:
4:
5:
6:
7:

<?php
function return_sec($hours$minutes$seconds) {
    
$seconds $seconds + ($minutes*60) + ($hours*60*60);
    return 
$seconds;
}
?>

Der Aufruf der Funktion erfolt wie folgt:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

<?php
// Hier im BSP sinds 0h,
$hours 0;

// 1min und
$minutes 1;

// 03sec 
$seconds 0;

// FUNKTION AUFRUFEN
$time return_sec($hours$minutes$seconds);

echo 
$time;
// Die Ausgabe wäre dann: 60
?>


Ich hoffe die Funktionen helfen euch weiter,

lg






www.php-einfach.de, PHP lernen leicht gemacht
www.webhosterwissen.de, Webhosting-Vergleich



28.01.2007, 13:44 Profil | PM | E-Mail  
Snowball
Mitglied
Guter User


Dabei seit: 21.06.2007
Herkunft: Polen
Posts: 407
      Zitat | Bearbeiten

kann man das auch irgentwie die werte inmysql umwandeln? will nähmlich, das der erste wert mit dem anderen subtrahiert wird, sodass man dann sehen wievielübrig ist.

es sollte eigentlich so aussehen:
das wasübrigbleibt ist gold, also die währungineinem browsergame,und man soll jetzt alle 24 stunden 10 goldbekommen, aber immer um 24 uhr.

ich habe leiderkeine ahnung wieich das machen soll,kann mir da nicht jemand helfen?


Alles was ein Coder brauch:
http://iuploads.iu.ohost.de/iuploads/
http://iuploads.iu.ohost.de/cpaste/
23.06.2007, 08:57 Profil | PM | E-Mail  
[AxT] - Alexander
Mitglied
Anfänger


Dabei seit: 29.09.2006
Herkunft: GERMANY
Posts: 86
      Zitat | Bearbeiten

Hallo,

ich habe meine "make_hmi" mal wieder ein bisschen modifiziert, hier das Ergebniss:

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
<?php
/**
* -- make_hmi v0.2 --
* @author: Alexander Thiemann
* @title: make_hmi
* @version: 0.2
*
* -- UPDATES --
* x Führende "0" (AKTIVIERE DURCH OPTIMALEN PARAMETER $add_zero)
* x Output Arten (array & string & formated string) (OPTIMALE PARAMETER $output & $format)
*
* -- README --
* x $time x
* In $time werden die Sekunden übergeben
*
* x $add_zero x (OPTIMAL, STANDART: "OFF")
* Wird hier "On" übergeben, wird eine führende "0" angehängt falls die Stunden/Minuten/Sekunden unter 10 gehen. Bei formatierter Ausgabe bitte auf "Off" stehen lassen.
*
* x $output x (OPTIMAL, STANDART: "ARRAY")
* Hier wird der Ausgabe Typ definiert. MÖGLICH IST: array, string, format
*
* x $format x (OPTIMAL, STANDART: "")
* Sollte der Ausgabe Typ "format" sein, kann man hier das Format/Muster übergeben.
*/

function make_hmi($time$add_zero "Off"$output "array"$format "") {
    
$time $time 60;
    
$hours floor(($time 60) / 3600);
    
$minutes floor($time) - ($hours 60);

    
$seconds round(fmod($time 6060), 0);

    
// Führende "0"
    
if ($add_zero != "Off") {
        if (
$hours 10) {
            
$hours "0".$hours;
        }
        if (
$minutes 10) {
            
$minutes "0".$minutes;
        }
        if (
$seconds 10) {
            
$seconds "0".$seconds;
        }
    }
    if (
$output == "array") {
        return array(
'hours' => $hours'minutes' => $minutes'seconds' => $seconds);
    }
    elseif (
$output == "string") {
        return 
"{$hours}:{$minutes}:{$seconds}";
    }
    elseif (
$output == "format") {
        return 
sprintf($format$hours$minutes$seconds);
    }
    else {
        return 
false;
    }
}

# Beispiel #
// 60 Sekunden
$seconds 60;

// KEINE FÜHRENDE "0", AUSGABE: ARRAY
echo '<h1>KEINE FÜHRENDE "0", AUSGABE: ARRAY</h1>';
var_dump(make_hmi($seconds));// array(3) { ["hours"]=>  float(0) ["minutes"]=>  float(1) ["seconds"]=>  float(0) }

// FÜHRENDE "0", AUSGABE: ARRAY
echo '<h1>FÜHRENDE "0", AUSGABE: ARRAY</h1>';
var_dump(make_hmi($seconds"On"));// array(3) { ["hours"]=>  string(2) "00" ["minutes"]=>  string(2) "01" ["seconds"]=>  string(2) "00" }

// KEINE FÜHRENDE "0", AUSGABE: STRING
echo '<h1>KEINE FÜHRENDE "0", AUSGABE: STRING</h1>';
var_dump(make_hmi($seconds"Off""string"));// string(5) "0:1:0"

// FÜHRENDE "0", AUSGABE: STRING
echo '<h1>FÜHRENDE "0", AUSGABE: STRING</h1>';
var_dump(make_hmi($seconds"On""string"));// string(8) "00:01:00"

// KEINE FÜHRENDE "0", AUSGABE: FORMATIERT
echo '<h1>KEINE FÜHRENDE "0", AUSGABE: FORMATIERT</h1>';
var_dump(make_hmi($seconds"Off""format"'%01d:%01d:%01d'));// string(5) "0:1:0"

// FÜHRENDE "0", AUSGABE: FORMATIERT
echo '<h1>FÜHRENDE "0", AUSGABE: FORMATIERT </h1>';
var_dump(make_hmi($seconds"Off""format"'%02d:%02d:%02d'));// string(8) "00:01:00"
?>


Sollte sich eigentlich selber erklären.

lg




Post wurde schon 1x editiert, das letzte mal am 03.07.2007 um 04:00 von [AxT] - Alexander
03.07.2007, 03:59 Profil | PM | E-Mail  
vul
Mitglied
Neuling


Dabei seit: 25.02.2010
Herkunft: keine Angabe
Posts: 8
      Zitat | Bearbeiten

super ding. aber wie bringt man hier das string(8) "" weg?


01.03.2010, 20:34 Profil | PM | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Zeitdifferenz   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz