View difference between Paste ID: TEEjW5Ck and 8zDxkMR4
SHOW: | | - or go back to the newest paste.
1
<?php
2
class BusinessCalc
3
{
4
    const BUSINESS_START = 9;
5
    const BUSINESS_END = 17;
6
    const SECONDS_PER_HOUR = 3600;
7
    const SECONDS_PER_DAY = 86400;
8
9
    /**
10
     * @var array $_excludedDays
11
     */
12
    protected $_excludedDays = array(6, 7);
13
14
    /**
15
     * @var DateTime $_start
16
     */
17
    protected $_start;
18
19
    /**
20
     * @param DateTime $start
21
     */
22
    public function __construct($start)
23
    {
24
        $this->_start = $start;
25
    }
26
27
    /**
28
     * @param DateTime $now
29
     * @return integer
30
     */
31
    public function calculateSeconds(DateTime $now)
32
    {
33
        $difference = 0;
34
        if ($this->_isBusinessDay($this->_start)
35
            && $this->_isInBusinessTime($this->_start)
36
        ) {
37
            $difference += $this->_getEndOfBusinessDay($this->_start)->getTimestamp()
38
                - $this->_start->getTimestamp();
39
        }
40
41
        if ($this->_isBusinessDay($now)
42
            && $this->_isInBusinessTime($now)
43
        ) {
44
            $difference += $this->_getStartOfBusinessDay($now)->getTimestamp()
45
                - $now->getTimestamp();
46
        }
47
48
        // the following part looks crappy but works ;)
49
        // adds business hours to difference
50
        // checks if the last day is reached, skips this, cause we already have this above
51-
        while ($dayIterator + 86400 < $now->getTimestamp()
51+
52
        while ($dayIterator + self::SECONDS_PER_DAY < $now->getTimestamp()
53
            && $this->_getEndOfBusinessDay(new DateTime('@' . $dayIterator))->getTimestamp() < $now->getTimestamp()
54-
            $dayIterator += 86400;
54+
55
            $dayIterator += self::SECONDS_PER_DAY;
56
            if ($this->_isBusinessDay(new DateTime('@' . $dayIterator))) {
57
                $difference += (self::BUSINESS_END - self::BUSINESS_START) * self::SECONDS_PER_HOUR;
58
            }
59
60
        }
61
62
        return $difference;
63
    }
64
65
    /**
66
     * @param DateTime $time
67
     * @return DateTime
68
     */
69
    protected function _getEndOfBusinessDay($time)
70
    {
71
        $endOfDay = new DateTime('@' . $time->getTimestamp());
72
        $endOfDay->setTime(self::BUSINESS_END, 0, 0);
73
        return $endOfDay;
74
    }
75
76
    /**
77
     * @param DateTime $time
78
     * @return DateTime
79
     */
80
    protected function _getStartOfBusinessDay($time)
81
    {
82
        $startOfDay = new DateTime('@' . $time->getTimestamp());
83
        $startOfDay->setTime(self::BUSINESS_START, 0, 0);
84
        return $startOfDay;
85
    }
86
87
    /**
88
     * @param DateTime $time
89
     * @return integer
90
     */
91
    protected function _getWeekDay($time)
92
    {
93
        return date('N', $time->getTimestamp());
94
    }
95
96
    /**
97
     * @param DateTime $time
98
     * @return boolean
99
     */
100
    protected function _isInBusinessTime(DateTime $time)
101
    {
102
        if ($time->getTimestamp() <= $this->_getEndOfBusinessDay($time)->getTimestamp()
103
            && $time->getTimestamp() >= $this->_getStartOfBusinessDay($time)->getTimestamp()
104
        ) {
105
            return true;
106
        } else {
107
            return false;
108
        }
109
    }
110
111
    /**
112
     * @param DateTime $time
113
     * @return boolean
114
     */
115
    protected function _isBusinessDay($time)
116
    {
117
        $weekday = date('N', $time->getTimestamp());
118
        if (in_array($weekday, $this->_excludedDays) === true) {
119
            return true;
120
        } else {
121
            return false;
122
        }
123
    }
124
}
125
126
127
error_reporting(-1);
128
$start = time() - 12234567;
129
$a = new BusinessCalc(new DateTime('@' . $start));
130
echo $a->calculateSeconds(new DateTime());