2017-05-08 9 views
0

私は現在strtotime()の問題で立ち往生しています。ユーザーが作業時間を入力できるスクリプトのタイムテーブルを準備しています。スクリプトはxmlファイルからすべての変数を取得し、pdfを作成します。これまでの作業はすべてスムーズですが、夜間に入ると奇妙な問題があります。2日実行時のPHP strtotimeの問題

私はユーザが21:00(午後9時)に作業を開始し、06:00(午前6時)に終了するデバッグの例を設計しました。 正確に入力された勤務時間を取得したいので、毎回strtotime()を入力して比較します。

開始時刻が1日目、終了時刻が2日目ですが、スクリプトが1日目にまだ考えていると思います...申し訳ありませんが、解決策は見つかりませんでした。ここに私を助けることができます。

コード例:

<?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: 今のところ動作しますが、おそらく誰かがよりよい解決策を持っている回避策を見つけ

コード:

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

@ノーランドあなたがいない場合は、私の投稿を使用することができます。 –

答えて

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

start-timeend-timeより大きい場合、ここでは逆の時間に24Hoursを追加します。場合は、日付がない場合は、このソリューションを使用することができます。

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; 

?>