<?php
$dateTime = DateTime::createFromFormat('d M Y', '12 Dec 2016');
var_dump(getWorkingDayAfterNDays
($dateTime, 5));
function getWorkingDayAfterNDays(DateTime $dateTime, $n) {
if ($n < 0) {
throw new Exception('Число должно быть положительным ' . $n);
}
for ($i = 0; $i < 365; $i++) {
$dateTime->modify('+1 day');
if (!isDayOff($dateTime) && !isHoliday($dateTime)) {
$n--;
if ($n === 0) {
return $dateTime;
}
}
}
throw new Exception('В году рабочих дней меньше, чем ' . $m);
}
// Выходной
function isDayOff(DateTime $dateTime) {
// Суббота и воскресенье
$daysOff = [6, 0];
// w - Номер дня недели
return in_array($dateTime->format('w'), $daysOff); }
// Праздник
function isHoliday(DateTime $dateTime) {
$holydays = [
// День, месяц
'19-12',
'20-12',
];
return in_array($dateTime->format('d-m'), $holydays); }
PD9waHAKCiRkYXRlVGltZSA9IERhdGVUaW1lOjpjcmVhdGVGcm9tRm9ybWF0KCdkIE0gWScsICcxMiBEZWMgMjAxNicpOwoKdmFyX2R1bXAoZ2V0V29ya2luZ0RheUFmdGVyTkRheXMoJGRhdGVUaW1lLCA1KSk7CgpmdW5jdGlvbiBnZXRXb3JraW5nRGF5QWZ0ZXJORGF5cyhEYXRlVGltZSAkZGF0ZVRpbWUsICRuKSB7CiAgICBpZiAoJG4gPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbign0KfQuNGB0LvQviDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0LwgJyAuICRuKTsKICAgIH0KCiAgICBmb3IgKCRpID0gMDsgJGkgPCAzNjU7ICRpKyspIHsKICAgICAgICAkZGF0ZVRpbWUtPm1vZGlmeSgnKzEgZGF5Jyk7CiAgICAgICAgaWYgKCFpc0RheU9mZigkZGF0ZVRpbWUpICYmICFpc0hvbGlkYXkoJGRhdGVUaW1lKSkgewogICAgICAgICAgICAkbi0tOwogICAgICAgICAgICBpZiAoJG4gPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZGF0ZVRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdGhyb3cgbmV3IEV4Y2VwdGlvbign0JIg0LPQvtC00YMg0YDQsNCx0L7Rh9C40YUg0LTQvdC10Lkg0LzQtdC90YzRiNC1LCDRh9C10LwgJyAuICRtKTsKfQoKLy8g0JLRi9GF0L7QtNC90L7QuQpmdW5jdGlvbiBpc0RheU9mZihEYXRlVGltZSAkZGF0ZVRpbWUpIHsKICAvLyDQodGD0LHQsdC+0YLQsCDQuCDQstC+0YHQutGA0LXRgdC10L3RjNC1CiAgJGRheXNPZmYgPSBbNiwgMF07CgogIC8vIHcgLSDQndC+0LzQtdGAINC00L3RjyDQvdC10LTQtdC70LgKICByZXR1cm4gaW5fYXJyYXkoJGRhdGVUaW1lLT5mb3JtYXQoJ3cnKSwgJGRheXNPZmYpOwp9CgovLyDQn9GA0LDQt9C00L3QuNC6CmZ1bmN0aW9uIGlzSG9saWRheShEYXRlVGltZSAkZGF0ZVRpbWUpIHsKICAgICRob2x5ZGF5cyA9IFsKICAgICAgICAvLyDQlNC10L3RjCwg0LzQtdGB0Y/RhgogICAgICAgICcxOS0xMicsCiAgICAgICAgJzIwLTEyJywKICAgIF07CgogICAgcmV0dXJuIGluX2FycmF5KCRkYXRlVGltZS0+Zm9ybWF0KCdkLW0nKSwgJGhvbHlkYXlzKTsKfQo=