2

これは私が仕事に就くことができなかった唯一のことです。
私の問題は、ある日の終わりと次の日の始まりを検出し、差分を毎日に分割することです。

賃金率を計算したいが、真夜中にまたがる必要があると想像してください。

また、時間制システムで実行する時間、または実行する必要がある時間差の計算にも適用されます。

4

5 に答える 5

8

私は常に Unix Epoch で記録することを好みます。そうすれば、次のように簡単になります。

hoursWorked = ((stopTime - startTime)/60)/60

これはPHPでの完全なソリューションですが、どの言語でも簡単に構築できるはずです。

<?php
$startTime = "12/31/2008 22:02"; //No AM/PM we'll use 24hour system
$endTime = "01/01/2009 06:27"; //Again no AM/PM and we spaned the midnight time gap.
/*
Use this to test for a normal shift not ocurring durring midnight.
$startTime = "01/01/2008 06:02"; //No AM/PM we'll use 24hour system
$endTime = "01/01/2008 14:27"; //Again no AM/PM and we spaned the midnight time gap.
*/
$startTime = split(' ', $startTime);
$endTime = split(' ', $endTime);
$startTime[1] = split(':', $startTime[1]);
$endTime[1] = split(':', $endTime[1]);
/*
$startTime[0] contains the date
$startTime[1][0] contains the hours
$startTime[1][1] contains the minutes
same is true for endTime
*/
if($startTime[0] != $endTime[0])
 {
    if(date2epoch($endTime[0]) > date2epoch($startTime[0]))
     {
        $minutesWorked1 = (59 - $startTime[1][1]); //Calculate how many minutes have occured from begining of shift to midnight
        $minutesWorked2 = $endTime[1][1]; //Number of minute from midnight to end of shift
        $hoursWorked1 = (23 - $startTime[1][0]);//Number of hours from start of shift to midnight
        $hoursWorked2 = $endTime[1][0];//Number of minutes from midnight to end of shift
        echo 'Before midnight you worked ' . $hoursWorked1 . ':' . $minutesWorked1 . "\nAfter midnight you worked " . $hoursWorked2 . ':' . $minutesWorked2 . '.';
     }
    else 
     {
        //SOMETHING MAJOR BAD HAS HAPPENED WHILE LOGGING THE CLOCKINS AND CLOCKOUTS
     }
 }
else 
 {
    echo 'Today you worked ' . ($endTime[1][0] - $startTime[1][0]) . ':' . ($endTime[1][1] - $startTime[1][1]);
 }
function date2epoch($date, $format='m/d/Y')
 {
    $date = split('/', $date);
    return mktime('0', '0', '0', $date[0], $date[1], $date[2]);
 }
?>
于 2008-10-05T21:43:47.743 に答える
7

これは明らかに、開始時刻と終了時刻が日付と時刻の両方を含むデータ構造であるシステムでは些細な問題です。しかし、これを行わないシステムがたくさんあります。計時システムが、日付、開始時刻、および終了時刻を含む単一のレコードを持つことは非常に一般的です。この場合、問題はさほど重要ではありません。

あなたが尋ねている2つの質問があると思います:

  1. 時間帯が午前 0 時を超えるかどうかを確認するにはどうすればよいですか?
  2. ある期間が午前 0 時をまたぐ場合、初日に発生した時間はどれくらいで、2 日目に発生した時間はどれくらいですか?

最初の質問は簡単に答えられます。終了時刻が開始時刻よりも前の場合、期間は午前 0 時を超えています。

この場合、2 つの金額を計算する必要があります。日付に発生した時間範囲の量は、開始時刻から午前 0 時までの時間です。次の日付に発生したタイム スパンの量は、午前 0 時から終了時刻までの時間です (つまり、終了時刻のみ)。

于 2008-10-05T22:17:58.843 に答える
2

利用可能な日付がある場合は、日付と時刻の組み合わせで作業する必要があり、問題にはなりません。

期間が 24 時間未満になることがわかっている場合:

if endtime < starttime then endtime = endtime + 24 hours
于 2008-10-05T21:45:39.017 に答える
2

ほとんどの言語では、Date/DateTime/etc. クラスには、このようなことのためのメソッドがあります。これらを使用する場合、算術を実行する前にすべての日付を UTC に変換することをお勧めします。

例: C#:

// In UTC, preferably
DateTime ClockIn;
DateTime ClockOut;

ClockIn = ...;
ClockOut = ...;

TimeSpan TimeWorked = ClockOut.Subtract(ClockIn);
float HoursWorked = TimeWorked.TotalHours();
于 2008-10-05T21:52:31.173 に答える
1

両方の時間が同じタイム ゾーンにない場合は、計算を行う前にそれらを UTC に変換する必要があります :) ここでは当てはまらないかもしれませんが、これはよくある問題です。

于 2008-10-06T00:08:23.457 に答える