2017-05-08 2 views
0

Ich bin derzeit mit einem Problem in strtotime() Funktion stecken. Ich bereite einen Zeitplan für meine Arbeit vor, bei dem Benutzer ihre Arbeitszeiten eingeben können und das Skript alle Variablen aus einer XML-Datei bekommt und ein PDF erstellt ... funktioniert alles glatt, aber es gibt ein seltsames Problem beim Eingeben einer Nachtschicht.PHP strtotime Problem bei der Ausführung von 2 Tagen

Also entwarf ich ein Debug-Beispiel, bei dem ein Benutzer seine Arbeit um 21:00 Uhr (21:00 Uhr) beginnt und um 6:00 Uhr (6:00 Uhr) beendet. Ich möchte die genaue eingegebene Arbeitszeit so I strtotime() jedes Mal und vergleichen Sie sie.

Ich denke, das Problem ist, weil Startzeit am Tag 1 und Ende ist am Tag 2, aber das Skript denkt, es ist immer noch am ersten Tag ... Sorry, aber ich habe keine Lösung gefunden, so hoffe ich, jemand hier kann mir helfen.

Beispielcode:

<?php 

set_time_limit(0); 
date_default_timezone_set('Europe/Berlin'); 

$start = '20:30'; 
$finish = '06:30'; 
$break_1_Start = '20:45'; 
$break_1_End = '21:00'; 
$break_2_Start = '00:00'; 
$break_2_End = '00:30'; 
$break_3_Start = '03:00'; 
$break_3_End = '03:30'; 
$break_4_Start = '06:00'; 
$break_4_End = '06:15'; 

/** 
* Minus when + 1 day 
*/ 
$workTime = strtotime($finish) - strtotime($start); 

$break1 = strtotime($break_1_End) - strtotime($break_1_Start); 
$break2 = strtotime($break_2_End) - strtotime($break_2_Start); 
$break3 = strtotime($break_3_End) - strtotime($break_3_Start); 
$break4 = strtotime($break_4_End) - strtotime($break_4_Start); 

$workTime = $workTime - $break1 - $break2 - $break3 - $break4; 

$workTime = $workTime/60; 
$workTime = $workTime/60; 
echo 'Work Time: '.$workTime; 

?> 

EDIT: eine Abhilfe gefunden, die jetzt funktioniert, aber vielleicht hat jemand eine bessere Lösung

Code:

<?php 

set_time_limit(0); 
date_default_timezone_set('Europe/Berlin'); 

$start = strtotime('20:30'); 
$finish = strtotime('06:30'); 
$break_1_Start = strtotime('20:45'); 
$break_1_End = strtotime('21:00'); 
$break_2_Start = strtotime('00:00'); 
$break_2_End = strtotime('00:30'); 
$break_3_Start = strtotime('03:00'); 
$break_3_End = strtotime('03:30'); 
$break_4_Start = strtotime('06:00'); 
$break_4_End = strtotime('06:15'); 

if($finish > $start) { 
    $workTime = $finish - $start; 
} else { 
    $end1 = strtotime('24:00'); 
    $start1 = strtotime('00:00'); 
    $starty = $end1 - $start; 
    $endy = $finish - $start1; 
    $workTime = $starty + $endy; 
} 


$break1 = $break_1_End - $break_1_Start; 
$break2 = $break_2_End - $break_2_Start; 
$break3 = $break_3_End - $break_3_Start; 
$break4 = $break_4_End - $break_4_Start; 

$workTime = $workTime - $break1 - $break2 - $break3 - $break4; 

$workTime = $workTime/60; 
$workTime = $workTime/60; 
echo 'Work Time: '.$workTime; 

?> 
+2

So, dieses Datum enthalten sowie die Zeit – RiggsFolly

+0

Wie wäre es auch unter Berücksichtigung Datum. Sie können die Funktion time() verwenden, um die genauen Informationen in der XML-Datei zu speichern. –

+0

@NoLand Wenn Sie kein Datum haben, können Sie meinen Beitrag verwenden. –

Antwort

1

, wenn Sie mit dynamischer Datum mit der Zeit dann verwenden Sie dieses Datum mit der Zeit, während strtotime() Oder Sie können Dummy-Datum verwenden als:

$start = '2017-01-01 20:30'; 
$finish = '2017-01-02 06:30'; 
+0

Danke, dass das wie ein Zauber wirkte ... wusste nicht, dass inklusive Datum möglich war ... Danke – NoLand

0

Versuchen Sie die folgende Lösung.

Verwenden $start = date("d-m-Y H:i:s",time());

Während in der XML-Datei, die die Start/Ziel/Pause-Timings zu speichern.

Also alle Einträge enthalten auch Datum. Es wird keine Konflikte geben.

0

Hier fügen wir 24Hours zur entgegengesetzten Zeit hinzu, wenn start-time größer ist als end-time. Falls Sie kein Datum haben, können Sie diese Lösung verwenden.

Try this code snippet here

<?php 

set_time_limit(0); 
date_default_timezone_set('Europe/Berlin'); 

$start = '23:00'; 
$finish = '06:30'; 
$break_1_Start = '20:45'; 
$break_1_End = '21:00'; 
$break_2_Start = '00:00'; 
$break_2_End = '00:30'; 
$break_3_Start = '03:00'; 
$break_3_End = '03:30'; 
$break_4_Start = '06:00'; 
$break_4_End = '06:15'; 
if(strtotime($finish)> strtotime($start)) 
{ 
    $workTime = strtotime($start) - strtotime($finish); 
} 
else 
{ 
    $date=date_create_from_format("H:i", $finish); 
    $date->add(new DateInterval('PT24H'));//added 24 hours. 
    $workTime=strtotime($date->format("Y-m-d H:i:s"))- strtotime($start); 
} 
/** 
* Minus when + 1 day 
*/ 

$break1 = strtotime($break_1_End) - strtotime($break_1_Start); 
$break2 = strtotime($break_2_End) - strtotime($break_2_Start); 
$break3 = strtotime($break_3_End) - strtotime($break_3_Start); 
$break4 = strtotime($break_4_End) - strtotime($break_4_Start); 

$workTime = $workTime - $break1 - $break2 - $break3 - $break4; 

$workTime = $workTime/60; 
$workTime = $workTime/60; 
echo 'Work Time: '.(float)$workTime; 

?>