Расчет разницы во времени в полночь - PullRequest
2 голосов
/ 06 октября 2008

Это одна вещь, которую я никогда не смог получить на работу.
Моя задача - определить конец одного дня и начало следующего, а затем разбить разницу на каждый день.

Представьте, что вы хотите рассчитать ставку заработной платы, но она должна охватывать полночь.

Это также относится к вычислению времени, которое должно выполняться на временной системе, или к разнице времени, которую он должен был выполнить.

Ответы [ 5 ]

8 голосов
/ 06 октября 2008

Я предпочитаю записывать все время в 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]);
 }
?>
7 голосов
/ 06 октября 2008

Это очевидно тривиальная проблема в системах, где время начала и окончания являются структурами данных, которые содержат как дату, так и время. Но есть множество систем, которые этого не делают. Очень часто системы хронометража имеют одну запись, которая содержит дату, время начала и время окончания. В этом случае проблема менее тривиальна.

Я думаю, вы задаете два вопроса:

  1. Как я могу определить, пересекает ли промежуток времени полночь?
  2. Если промежуток времени пересекает полночь, сколько времени произошло в первый день и сколько во второй?

На первый вопрос легко ответить: если время окончания предшествует времени начала, промежуток времени пересекает полночь.

Если это так, то у вас есть две суммы для расчета. Интервал времени, который произошел в дате, является временем между временем начала и полуночью. Интервал времени, который произошел в следующую дату, представляет собой время между полуночью и временем окончания (т.е. только временем окончания).

2 голосов
/ 06 октября 2008

В большинстве языков дата / дата / время / и т. Д. у классов есть методы для таких вещей. При их использовании рекомендуется выполнить преобразование всех дат в UTC, прежде чем выполнять арифметику.

например, C #:

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

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

TimeSpan TimeWorked = ClockOut.Subtract(ClockIn);
float HoursWorked = TimeWorked.TotalHours();
2 голосов
/ 06 октября 2008

Если у вас есть доступная дата, вы должны работать с комбинацией дата + время, и это не будет проблемой.

Если вы знаете, что промежуток времени будет менее 24 часов:

if endtime < starttime then endtime = endtime + 24 hours
1 голос
/ 06 октября 2008

и если оба времени не находятся в одном часовом поясе, вам необходимо преобразовать их в UTC перед выполнением расчета :) Может быть неприменимо здесь, но это общая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...