Если вы можете просчитать время вперед, то что мешает сделать просчет назад? Хотя бы сделать так:
- просчитать все вперед и получить дату окончания $dEndNow, если мы стартуем сейчас $dStartNow
- находим дельту $delta времени между $dEndNow и временем, когда необходимо закончить работу $dEndReq
- к текущему времени $dStartNow добавляем дельту $delta и получаем время старта. Да, дельта может быть отрицательной, но это случай когда мы уже упустили момент старта, чтобы закончить вовремя.
Используя эту дельту можно так же указать время старта каждой задачи.