2010-01-28 129 views
1

我需要將工作時間添加到時間戳。工作時間爲上午8點至下午6點。假設我們有2點,我必須增加6個小時。結果應該是上午10點...任何猜測?將工作時間添加到時間戳

謝謝。

+0

我認爲我們需要一些詳細信息。根據您的示例,您是否只處理離散小時,或者它是否實際上使用時間戳,正如您的問題所暗示的那樣?我也懷疑在這個算法的任何實際應用中,你都需要考慮邊界條件,例如下午6點實際上是一個有效的迴應? – 2010-01-28 09:53:11

+0

你是對的...我有開始日期作爲時間戳。然後,我不得不增加幾個小時(像3等)。你關於邊界的問題是正確的(關於這種情況並沒有),而下午6點是無效的,所以結果應該是早上8點(具體的日期時間不只是一小時)。 – spamec 2010-01-28 10:04:03

回答

7

試試這個壞男孩。

您可以指定是否將週末包括爲工作日等。不考慮假期。

<?php 

function addWorkingHours($timestamp, $hoursToAdd, $skipWeekends = false) 
{ 
    // Set constants 
    $dayStart = 8; 
    $dayEnd = 16; 

    // For every hour to add 
    for($i = 0; $i < $hoursToAdd; $i++) 
    { 
     // Add the hour 
     $timestamp += 3600; 

     // If the time is between 1800 and 0800 
     if ((date('G', $timestamp) >= $dayEnd && date('i', $timestamp) >= 0 && date('s', $timestamp) > 0) || (date('G', $timestamp) < $dayStart)) 
     { 
      // If on an evening 
      if (date('G', $timestamp) >= $dayEnd) 
      { 
       // Skip to following morning at 08XX 
       $timestamp += 3600 * ((24 - date('G', $timestamp)) + $dayStart); 
      } 
      // If on a morning 
      else 
      { 
       // Skip forward to 08XX 
       $timestamp += 3600 * ($dayStart - date('G', $timestamp)); 
      } 
     } 

     // If the time is on a weekend 
     if ($skipWeekends && (date('N', $timestamp) == 6 || date('N', $timestamp) == 7)) 
     { 
      // Skip to Monday 
      $timestamp += 3600 * (24 * (8 - date('N', $timestamp))); 
     } 
    } 

    // Return 
    return $timestamp; 
} 

// Usage 
$timestamp = time(); 
$timestamp = addWorkingHours($timestamp, 6); 
+0

達姆好孩子;)這真的是工作的人,謝謝! – spamec 2010-01-28 10:33:52

-2

如果它是一個真正的時間戳,你只需要添加相當於6小時的秒。

$timestamp += 3600 * 6; 

如果不是我們需要知道「時間戳」的真實格式。

+0

它的工作,但只有在實際情況下......不工作時間,因爲結果必須在上午8點和下午6點範圍內。 – spamec 2010-01-28 09:46:30

+3

啊,我明白了。似乎我一直是自僱人士。整個「工作時間」的事情沒有響鐘xD – Atli 2010-01-28 10:45:29

0

一個更緊湊的版本:

function addWhours($timestamp, $hours, $skipwe=false, $startDay='8', $endDay='18') 
{ 
    $notWorkingInterval = 3600 * (24 - ($endDay - $startDay)); 
    $timestamp += 3600*$hours; 

    $our = date('H', $timestamp); 
    while ($our < $startDay && $our >= $endDay) { 
    $timestamp += $notWorkingInterval; 
    $our = date('H', $timestamp); 
    } 

    $day = date('N', $timestamp); 
    if ($skipwe && $day >5) { 
    $timestamp += (8-$day)*3600*24; 
    } 

    return $timestamp; 
}