PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Datumsdifferenz Fehler


z3ck3
2005-08-18, 13:03:17
Ich hab das problem, das bei dem Code Stunden und Sekunden vertauscht werden. Weiß aber net warum... Vielleicht kann mir ja jemand helfen.

mktime könnte die Ursache sein. Aber das doch richtig die Reihenfolge: Stunden Minuten Sekunden Monat Tag Jahr

Mein Datumsformat ist folgendes: Jahr Monat Tag Stunden Minuten Sekunden (benutze das überall, darum die zusätzlichen Funktionen etc.)


<?

function hfb_diftime($zeit, $zeit2 = "", $format = "%D %H %M %S") {

if (empty($zeit2)) {
$zeit2 = time();
} else {
$zeit2 = hfb_formatdate($zeit2, "YYYY MM DD hh mm ss");
$zeit2 = explode(" ", $zeit2);
$zeit2 = mktime($zeit2[5],$zeit2[4],$zeit2[3],$zeit2[1],$zeit2[2],$zeit2[0]);
}

$zeit = hfb_formatdate($zeit, "YYYY MM DD hh mm ss");
$zeit = explode(" ", $zeit);
$zeit = mktime($zeit[5],$zeit[4],$zeit[3],$zeit[1],$zeit[2],$zeit[0]);

if ($zeit == $zeit2) return 0;

if ($zeit < $zeit2) {
$diftime = $zeit2 - $zeit;
} else {
$diftime = $zeit - $zeit2;
}

$diftime_t = $diftime;

$vari["%D"] = floor($diftime_t / 86400);
$diftime_t = $diftime_t - ($vari["%D"] * 86400);
$vari["%H"] = floor($diftime_t / 3600);
$diftime_t = $diftime_t - ($vari["%H"] * 3600);
$vari["%M"] = floor($diftime_t / 60);
$diftime_t = $diftime_t - ($vari["%M"] * 60);
$vari["%S"] = $diftime_t;

$vari["%TH"] = floor($diftime / 3600);
$vari["%TM"] = floor($diftime / 60);
$vari["%TS"] = $diftime;

return strtr($format,$vari);

}

function hfb_formatdate($datum,$format="DD.MM.YY") {
if (empty($datum)) return;
$vari["YYYY"] = substr($datum,0,4);
$vari["YY"] = substr($datum,2,2);
$vari["MM"] = substr($datum,4,2);
$vari["MT"] = hfb_monattext(substr($datum,4,2));
$vari["DD"] = substr($datum,6,2);
$vari["hh"] = substr($datum,8,2);
$vari["mm"] = substr($datum,10,2);
$vari["ss"] = substr($datum,12,2);
return strtr($format,$vari);
}

function hfb_monattext($monat) {
$monat = intval($monat);
$ar[1] = "Januar";
$ar[2] = "Februar";
$ar[3] = "März";
$ar[4] = "April";
$ar[5] = "Mai";
$ar[6] = "Juni";
$ar[7] = "Juli";
$ar[8] = "August";
$ar[9] = "September";
$ar[10] = "August";
$ar[11] = "November";
$ar[12] = "Dezember";
return strtr($monat,$ar);
}

echo hfb_diftime("20041212111212", "20051212121212", "%TH Stunden unterschied insgesamt. Also %D Tage, %H Stunden, %M Minuten und %S Sekunden. %TS Sekunden gesammt.");

?>


ich glaub ich bin Blind. Vielleicht sollte ich doch Maurer werden :D

Kinman
2005-08-18, 13:09:56
schau mal:
unfug hat mir weitergeholfen. http://forum-3dcenter.de/vbulletin/showthread.php?t=242731
ich hab es ein bischen verändert.


function dateDiff($phpDate1, $phpDate2)
{
$month1 = substr($phpDate1,6,2);
$day1 = substr($phpDate1,4,2);
$year1 = substr($phpDate1,0,4);

$month2 = substr($phpDate2,6,2);
$day2 = substr($phpDate2,4,2);
$year2 = substr($phpDate2,0,4);

$timeende = mktime(0,0,0,$day1,$month1,$year1);
$timestart = mktime(0,0,0,$day2,$month2,$year2);
$diff = $timeende - $timestart;

$days = ($diff - ($diff % 86400)) /86400;
$diff = $diff - ($days * 86400);
$hours = ($diff - ($diff % 3600)) / 3600;
$diff = $diff - ($hours * 3600);
$minutes = ($diff - ($diff % 60)) / 60;
$diff = $diff - ($minutes * 60);
$seconds = ($diff - ($diff % 1)) / 1;
return $days;
}

Datum folgend angeben: yyyymmtt

mfg Kinman

z3ck3
2005-08-18, 13:13:19
ja das aber ne kleine Verion, meines ist etwas umfangreicher. Das Arbeitet ja z.B. nicht mit Minuten und Sekunden.

Bei meinem Script muss der Fehöler irgendwo bei mktime liegen, da kom mt dann schon ein falsches Ergebnis.

z3ck3
2005-08-18, 13:18:33
Ups ich habs gefunden *ARGH*

$zeit2 = mktime($zeit2[3],$zeit2[4],$zeit2[5],$zeit2[1],$zeit2[2],$zeit2[0]);

3 sind Stunden und 5 Sekunden ich blödhammel *sichselbsttritt*



Falls jemand Interesse an der Funktion hat, hier ist der Code in einer Fassung mit Erklärung:


// (c) 2005 by z3ck3 (http://www.123x.de)

function hfb_diftime($zeit, $zeit2 = "", $format = "%D %H %M %S") {

if (empty($zeit2)) {
$zeit2 = time();
} else {
$zeit2 = hfb_fdsmall($zeit2);
}

$zeit = hfb_fdsmall($zeit);

if ($zeit == $zeit2) return 0;

if ($zeit < $zeit2) {
$diftime = $zeit2 - $zeit;
} else {
$diftime = $zeit - $zeit2;
}

$diftime_t = $diftime;

$vari["%D"] = floor($diftime_t / 86400);
$diftime_t = $diftime_t - ($vari["%D"] * 86400);
$vari["%H"] = floor($diftime_t / 3600);
$diftime_t = $diftime_t - ($vari["%H"] * 3600);
$vari["%M"] = floor($diftime_t / 60);
$diftime_t = $diftime_t - ($vari["%M"] * 60);
$vari["%S"] = $diftime_t;

$vari["%TH"] = floor($diftime / 3600);
$vari["%TM"] = floor($diftime / 60);
$vari["%TS"] = $diftime;

return strtr($format,$vari);
}

function hfb_fdsmall($datum) {
$v[1] = substr($datum,0,4);
$v[2] = substr($datum,4,2);
$v[3] = substr($datum,6,2);
$v[4] = substr($datum,8,2);
$v[5] = substr($datum,10,2);
$v[6] = substr($datum,12,2);
return mktime($v[4],$v[5],$v[6],$v[2],$v[3],$v[1]);
}

// %D ganze Tage
// %H ganze Stunden (abzüglich der ganzen Tage)
// %M ganze Minuten (abzüglich der ganzen Stunden und Tage
// %S Sekunden (abzüglich der ganzen Minuten, Stunden und Tage
// %TH ganze Stunden insgesamt
// %TM ganze Minuten insgesamt
// %TS Sekunden insgesamt
//
// Datumsformat: Jahr(4) Monat(2) Tag(2) Stunden(2) Minuten(2) Sekunden(2)
// Beispiel: 2. November 2003 11 Uhr 45 Minuten und 3 Sekunden -> 20031102114503
//
// Funktion: hfb_diftime(DATUM1,DATUM2,STRING)
// Beispiel: hfb_diftime("20020101010100","20050101000000")
// Ausgabe: 1095 22 59 0
//
// Beispiel für STRING: "Unterschied zwischen den Daten: %D Tage, %H Stunden, %M Minuten und %S Sekunden"
// Wird STRING nicht angegeben, wird folgendes zurückgegeben:
// Tage Stunden Minuten Sekunden getrennt durch Leerzeichen
//
// Sind die beiden Daten gleich wird 0 zurückgegeben

Coda
2005-08-18, 19:33:49
Man muss schon sehr selbstverliebt sein um auf sowas ein Copyright draufzusetzen.

Gast
2005-08-19, 03:01:56
ja bin ich :) ich kanns einfach net sein lassen, das würd ich sogar über nen einzeiler schreiben um das Volumen zu verdoppeln :D