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);
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? –
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