2010-01-28 13 views
1

Je dois ajouter des heures de travail à un horodatage. Les heures de travail sont de 8h à 18h. Disons que nous avons 14 heures et je dois ajouter 6 heures. Le résultat devrait être 10h ... toutes les suppositions?Ajouter des heures de travail à l'horodateur

Merci.

+0

Je pense que nous avons besoin d'un peu plus en détail. Est-ce que vous ne traitez que des heures discrètes, selon votre exemple, ou utilisez-vous réellement un horodatage, comme votre question l'indique? Je soupçonnerais également que dans toute application pratique de cet algorithme, il faudrait considérer les conditions aux limites, par ex. est 18h réellement une réponse valide? –

+0

Vous avez raison ... J'ai une date de début comme timestamp. Ensuite, je dois ajouter des heures (montant comme 3 etc.). Votre question sur les limites est correcte (n'a pas de chose à propos de ce cas), et 18 heures n'est pas valide, donc le résultat devrait être 8 heures (datetime concret pas seulement heure). – spamec

Répondre

7

Essayez ce mauvais garçon.

Vous pouvez spécifier si vous souhaitez inclure les week-ends en tant que jours ouvrés, etc. Ne tient pas compte des jours fériés.

<?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

Damm bon garçon;) c'est vraiment l'homme qui travaille, merci! – spamec

-2

S'il s'agit d'un vrai horodatage, il suffit d'ajouter les secondes équivalentes à 6 heures.

$timestamp += 3600 * 6; 

Sinon, nous devons connaître le format réel de votre "horodatage".

+0

Cela fonctionne mais seulement en cas d'heures réelles ... pas d'heures de travail, car le résultat doit être dans la plage 8h et 18h. – spamec

+3

Ahh, je vois. Il semble que je sois indépendant depuis longtemps. Toute la "heure de travail" chose ne sonnait pas une cloche xD – Atli

0

Une version plus compacte:

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; 
}