2017-05-08 59 views
0

我目前在strtotime()函數中遇到問題。我正在爲我的工作準備一張時間表,用戶可以輸入他們的工作時間,腳本從一個xml文件中獲取所有變量並製作一份PDF文件...迄今爲止所有工作都很流暢,但進入夜班時存在一個奇怪的問題。執行2天PHP的strtotime問題

因此,我設計了一個調試示例,用戶在21:00(晚上9點)開始工作,並在06:00(早上6點)完成工作。 我想要得到確切的輸入工作時間,所以我strtotime()每次比較它們。

我想這個問題是因爲開始時間是第一天,結束時間是第二天,但腳本認爲它仍然在第一天...對不起,但我沒有找到任何解決方案,所以我希望有人在這裏可以幫助我。

示例代碼:

<?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; 

?> 

編輯: 發現了適用於現在,但也許有人有更好的解決方案解決方法

代碼:

<?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

所以包括日期,以及如何考慮日期以及時間 – RiggsFolly

+0

。你可以使用time()函數來存儲xml中的確切信息嗎? –

+0

@NoLand如果你沒有日期,你可以使用我的文章。 –

回答

1

,如果你使用動態與時間日期然後使用該日期與時間,而strtotime() 或者您可以使用虛擬日期爲:

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

感謝工作就像一個魅力...不知道,包括日期是可能的...謝謝 – NoLand

0

請嘗試以下解決方案。

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

雖然保存在XML文件中開始/結束/中斷計時。

所以所有的條目也會包含日期。不會有任何衝突。

0

這裏我們加入24Hours相反的時間,當start-time大於end-time。如果你沒有日期,你可以使用這個解決方案。

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; 

?>