4

私はここで働く人々のシフトパターンを計算しようとしています。終了時間から開始時間を差し引くことはほとんどの場合機能しますが、彼らが夜通し働いている場合はそうではありません。たとえば、で作業している人は次の10pm to 6amように表示されます。

22:00 - 06:00

私はそれを返したいのです8 hoursが、私はそれを行うための最良の方法を理解することができません。

迷惑なことに、Javascriptでもまったく同じことをしなければならないので、このためのロジックに頭を悩ませることができればと思います。この場合、一方の日付をもう一方の日付から削除しても機能しません...

どんな助けでも大歓迎です、ありがとう!

4

6 に答える 6

8
function timeDiff($firstTime,$lastTime) {
    $firstTime=strtotime($firstTime);
    $lastTime=strtotime($lastTime);
    $timeDiff=$lastTime-$firstTime;
    return $timeDiff;
}

echo (timeDiff("10:00","12:00")/60)/60;

もともとここにこれを書いた:https ://ao.ms/how-to-get-the-hours-difference-in-hhmm-format-in-php/

于 2012-04-27T14:00:31.470 に答える
5

文字列操作と数学を備えた古い学校:

$input = '22:00 - 06:00';
preg_match('/(\d+):(\d+)\D*(\d+):(\d+)/', $input, $matches);
list(, $startHour, $startMin, $endHour, $endMin) = $matches;
$totalMinutes = ($endHour * 60 + $endMin - $startHour * 60 + $startMin + 1440) % 1440;
$hours = floor($totalMinutes / 60);
$mins = $totalMinutes % 60;

echo "works for $hours hours, $mins minutes";

日付/時刻機能付き:

$input = '22:00 - 06:00';
list($start, $end) = array_map('trim', explode('-', $input));
$start = new DateTime($start.'+00:00');
$end = new DateTime($end.'+00:00');
if ($start > $end) $start->sub(new DateInterval('P1D'));
$interval = $end->diff($start);
echo "works for ".$interval->h." hours, ".$interval->m." minutes";

日付/時刻関数を使用するソリューションの悪魔の落とし穴:

$startとのオフセットを明示的に指定せず$end、夜勤について話している場合、夏時間が開始または終了する日にコードが実行されると、DSTオフセットが何であれ結果がずれます。

DateTimeこれは、、strtotimeなどを使用するすべてのソリューションに当てはまります。

于 2012-04-27T14:07:15.527 に答える
3

日付関数なし:

$start = '22:00';
$end = '06:00';

$getnum = function($value) {
    $pieces = explode(':', $value);
    if(count($pieces) > 0) {
        return (intval($pieces[0])*60)+intval($pieces[1]);
    }

    return 0;
};

$start_num = $getnum->__invoke($start);
$end_num = $getnum->__invoke($end);

$diff = max($start_num, $end_num) - min($end_num, $start_num);

echo intval($diff / 60).'.'.($diff % 60).' hours';
于 2012-04-27T13:59:29.633 に答える
2

関数mktime(http://php.net/manual/en/function.mktime.php)を使用して、秒数を返し、2つの日付を整数形式で減算できます。

<?php
   $date1=mktime(1, 2, 3, 4, 5, 2006);
   $date2=mktime(1, 2, 3, 4, 5, 2008);
   $diference=$date2-$date1;

   echo $diference

   ?>
于 2012-04-27T14:08:11.317 に答える
1

作業および最も簡単なサンプル:

$start = 22;
$end = 6;

if ($start > $end) {
    $end += 24;
}

$duration = $end - $start;

echo 'Duration: ' . $duration . 'hours.';
于 2012-04-27T14:01:00.553 に答える
-1

date_diffこの関数のエイリアスである、を調べることができます。

http://www.php.net/manual/en/datetime.diff.php

MySQLにもDATEDIFF()関数があるので、データベースからそれらを取得する場合は、SQLから直接実行できます(指定しなかったことは知っていますが、これについて言及したかっただけです)。

于 2012-04-27T13:57:07.910 に答える