Добавьте рабочие часы в метку времени - PullRequest
1 голос
/ 28 января 2010

Мне нужно добавить рабочее время к метке времени. Рабочее время с 8 утра до 6 вечера. Допустим, у нас есть 2 часа дня, и я должен добавить 6 часов. Результат должен быть 10 утра ... какие-нибудь догадки?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 28 января 2010

Попробуйте этого плохого мальчика.

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

<?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 голосов
/ 28 января 2010

Более компактная версия:

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;
}
0 голосов
/ 28 января 2010

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

$timestamp += 3600 * 6;

Если нет, нам нужно знать реальный формат вашей "метки времени".

...