2017-06-28 5 views
1

hhhhhmmのように、データベースに保存されている勤務時間は勤務時間が789:07(789時間7分)です。PHPで累積時間を処理する方法

function addHours($initialTime, $endTime){ 
     $hourStart = $this->getHoursMinutes($initialTime); 
     $hourEnd = $this->getHoursMinutes($endTime); 

     $totalMinutes = $hourStart[1] + $hourEnd[1]; 

     $totalHours = 0; 
     if($totalMinutes >= 60){ 
      $totalHours = 1; 
      $totalMinutes -= 60; 
     } 

     $totalHours = $hourStart[0] + $hourEnd[0]; 

     return sprintf("%02d", $totalHours).":".sprintf("%02d", $totalMinutes); 
     } 

substract方法は次のとおりです:

function substractHours($initialTime, $endTime){ 
     $hourStart = $this->getHoursMinutes($initialTime); 
     $hourEnd = $this->getHoursMinutes($endTime); 


     $totalHours = $hourEnd[0] - $hourStart[0]; 

     $totalMinutes = $hourEnd[1] - $hourStart[1]; 
     if($totalMinutes <0){ 
      $totalMinutes += 60; 
      $totalHours--; 
     } 

     return sprintf("%02d", $totalHours).":".sprintf("%02d", $totalMinutes); 
     } 

メソッドの動作時間を加算または減算することができ、私は時間と分で文字列を分割し、次のように操作をしたか何を仕事 私は2時間減算しなければならなかったまで:

50:00 - 50:06

を結果がでなければなりません-00:06(エクセル関数のように)しかし、私は得ました私はこの問題を解決する方法を知りません。

フォーラムや投稿のPHP関数やサンプルコードとは別の方法ですが、最大値は24:00となります。

+7

分をデータベースに保存してから、その方法を計算するだけではどうですか?例えば789:07 = 47347分。その後数分から数時間に簡単な数学と変換が行われます:https://stackoverflow.com/questions/8563535/convert-number-of-minutes-into-hours-minutes-using-php – ctwheels

+0

最初の変換時間:分から分まで加算または減算してから時分:分に変換します。 –

+0

こんにちは@Cwwels。フィールドは既にテキストhh:mmとして保存されており、実際にはそれを変更するオプションはありません。ありがとう –

答えて

0

分を時間に変換する必要があるため、時間の記号と分の記号が異なる場合、問題が発生しています。

function substractHours($initialTime, $endTime){ 
    $hourStart = $this->getHoursMinutes($initialTime); 
    $hourEnd = $this->getHoursMinutes($endTime); 

    $totalHours = $hourEnd[0] - $hourStart[0]; 
    $totalMinutes = $hourEnd[1] - $hourStart[1]; 
    if($totalHours > 0 && $totalMinutes < 0) { 
    $totalMinutes = 60 + $totalMinutes; 
    $totalHours--; 
    } 
    else if ($totalHours < 0 && $totalMinutes > 0) { 
    $totalMinutes = 60 - $totalMinutes; 
    $totalHours++; 
    } 

    return sprintf("%02d", $totalHours).":".sprintf("%02d", $totalMinutes); 
} 

しかし、それはほんの数分に時間を変換する方が簡単でしょう、数学を行うと、バック変換します。ですから、それらの状況をチェックし、それに応じて処理する必要があります。

$start = $hoursStart[0]*60 + $hoursStart[1]; 
$end = $hoursEnd[0]*60 + $hoursEnd[1]; 

// ... do math ... 

$totalHours = floor(abs($total/60)); 
$totalMinutes = abs($total) % 60; 
$sign = $total < 0 ? "-" : ""; 
+0

こんにちはSorayadragon、私は簡単な方法を行う、時間を変換し、分を変換して表示しています。 ありがとうございます –

0

行うための最善のことは、 分、この場合には、最小単位でそれを格納することです。すべての操作が簡単になります。このデータを表示する場合は、最後の形式を に変更するだけです。ここで

はあなたのフォーマットされた時間を表示する機能の例です。

function 
formattedTime($min): string 
{ 
    $sign = $min < 0 ? '-' : ''; 
    $min = abs($min); 

    return sprintf('%s%02d:%02d', $sign, intdiv($min, 60), $min % 60); 
} 

は、次に、あなたが実際にあなたが は、標準の演算子+または-を使用することができるよう時間を減算または追加する機能は必要ありません。しかし何らかの理由で のデータ形式を変更できない場合、またはそれらの関数を使用し続ける必要がある場合は、 は経過した時刻を分に変換して処理します。 シンプル:

function 
getMinutes($time): int 
{ 
    $pieces; 
    if (preg_match('/(\d+):(\d+)/', $time, $pieces)) 
     return $pieces[1]*60 + $pieces[2]; 

    return -1; # or throw Exception, i.e. 
} 

function 
addHours($initialTime, $endTime) 
{ 
    $initialTime = getMinutes($initialTime); 
    $endTime  = getMinutes($endTime); 

    return formattedTime($initialTime + $endTime); 
} 

function 
subtractHours($initialTime, $endTime) 
{ 
    $initialTime = getMinutes($initialTime); 
    $endTime  = getMinutes($endTime); 

    return formattedTime($initialTime - $endTime); 
} 
+0

お返事ありがとうございます@シジル、私はこれを試してみます。 –

0

時間と分の両方を格納するポイントはありません。単一の時間単位に固執し、アプリケーション全体で使用してください。覚えておいてください。コンピュータは、コンピュータがそれが単なる数字である限り、数分と数時間の区別について気にしません。ユーザーだけが気にします。

時間と分の両方を保存する場合、実装しようとしているすべてのジャグリングを実行する必要がありますが、分などを保存するだけでは、合計時間を合計すると簡単に追加できます。さらにSELECT SUM(column_name)クエリ

ユーザーが時間と分を気にしている場合、floor()とモジュラス演算子を使用して、表示時に簡単な変換を行うことができます。

$hours = floor($total_minutes_as_fetched_from_database/60); 
$minutes = $total_minutes_as_fetched_from_database % 60; 

echo "Total time is $hours hour(s) and $minutes minute(s)"; 
関連する問題