Публикую как есть

3. Торговый интервал (ТИ) – определенный временной период, в течение которого доверительным управляющим совершаются сделки, направленные на получение прибыли и по окончанию которого производится расчет финансового результата. Торговый интервал определяется Управляющим в момент создания торгового счета и в дальнейшем не может быть изменен. Начало Торгового Интервала определяется в момент активизации Управляемого счета (первого пополнения pamm-счета). В отчетах финансовый результат группируется по торговым интервалам. Длина торгового интервала (ТИ) задается еще до начала торговли и может быть выражена в днях, неделях, месяцах. Отсчет интервалов начинается с момента, когда трейдер начал работу. Например, если длинна ТИ=3 дня, а трейдер начал работу 2013-01-15 в 16:00:00 то начало второго ТИ будет 2013-01-16 в 16:00:00, а если длинна ТИ=1 месяц, то начало второго ТИ - 2013-02-15 в 16:00:00. В случае, если длинна ТИ задана в месяцах и окончание ТИ приходится на несуществующую дату (напр. 31 апреля), то началом следующего ТИ считается 00 часов 00 минут 00 секунд 1-го числа следующего месяца (например, начало торговли -  2013-01-31 в 16:00:00, начало 4-го ТИ - 2013-05-01 в 00:00:00, а начало 5-го ТИ - 2013-06-31 в 16:00:00). Напишите функцию getTradeIntervalDate($interval, $tradeStartDate, $dateTime), которая будет возвращать массив array($from, $to), где $from и $to - время начала и окончания торгового интервала, которому принадлежит время, переданное в параметре $dateTime $inverval - длинна ТИ, может принимать значения: 1d, 2d, 1w, 2w, 3w, 1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 10m, 11m, 12m (d - дни, w - недели, m - месяцы) $tradeStartDate - время начала торговли. Для передачи значений времени можно использовать строки, целые числа или объекты - на ваше усмотрение.

Решение

В архиве три файла.

1)Класс с методом getTradeIntervalDate($interval, $tradeStartDate, $dateTime)

2)Класс-Exception

3)Тест. Расчет Торгового Интервала