Метод разбиения промежутка времени по дням с фиксацией времени начала и конца дня для указанного периода времени

При работе с периодом дат, где фигурирует начало и конец, иногда возникает задача разбиения иного на промежутки времени по каждому дню с возможностью фиксации времени начала и окончания каждого дня, в зависимости от выходных параметров.

Для примера представим, что клиент в абстрактной системе отчетов устанавливает период времени с 01:00 15.12.2014 по 23:00 21.12.2014 (1 неделя), за который он желает получить информацию. Фабрика отчетов на сервере умеет отдавать данные за период не более 24 часов. Вот тут и встает задача разбить промежуток времени на отрезки, с которыми потом можно работать в фабрике, т.е. на дни. Для получения можно воспользоватся функцией getDateTimeStartStopByDays (см. ниже), которая принимает в качестве параметров начало и конец периода в формате Timestamp. А на выходе мы получаем массив дат с указанием начала и конца каждого дня. Больше деталей смотрите в реализации метода.

Конечно можно работать только с датами в формате Unixtime, но в случае необходимости получения именно отформатированного массива дней, данный метод может Вам пригодится.

Коментарии по улучшению кода (стилистики, подхода, реализации и пр.) приветствуются!


/**
 * Метод разбиения промежутка времени по дням с фиксацией времени начала и конца дня для указанного периода времени.
 *
 * @param int $timestampStart Timestamp время начала периода.
 * @param int $timestampStop Timestamp время окончания периода.
 *
 * @return array Возвращает ассоциативный массив с индексом по датам в формате 'Y-m-d' со значением
 *               array('startTime' => 'H:i', 'stopTime' => 'H:i').
 */
function getDateTimeStartStopByDays($timestampStart, $timestampStop)
{
    try {
        $start = new DateTime;
        $start->setTimestamp($timestampStart);
        $stop = new DateTime;
        $stop->setTimestamp($timestampStop);

        $tmp = $start->getTimestamp();
        $result = array();

        while ($stop->getTimestamp() >= $tmp) {
            $date = new DateTime;
            $date->setTimestamp($tmp);

            $result[$date->format("Y-m-d")] = array(
                'startTime' => $date->format("H:i"),
                'stopTime'  => $date->setTime(23, 59, 59)->format('H:i')
            );

            $date->setTime(0, 0, 0)->modify("+1 day");
            $tmp = $date->getTimestamp();
        }
        if (isset($date)) {
            if ($start->format('Ymd') == $stop->format('Ymd')) {
                $result[$start->format('Y-m-d')]['stopTime'] = $stop->format('H:i');
            } elseif ($stop->format('H:i') != $result[$start->format('Y-m-d')]['stopTime']) {
                $result[$stop->format('Y-m-d')]['stopTime'] = $stop->format('H:i');
            }
        }
        return $result;
    } catch (Exception $e) {
        return array();
    }
}
  • +2
  • 24 декабря 2014, 18:06
  • a1ex

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus