Я знаю, что уже есть принятый ответ, но imho он не соответствует второму требованию, которое было запрошено. В приведенном выше случае strtotime выдает вчера, если используется в среду. Так что, если быть точным, вам все равно нужно проверить это:
$tuesday = strtotime('last Tuesday');
// check if we need to go back in time one more week
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400 : $tuesday;
Как отметил Дэвид в своем комментарии, это был мой быстрый снимок. Приведенный выше расчет будет отключен один раз в год из-за перехода на летнее время. Достаточно хорошее решение будет:
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400+7200 : $tuesday;
Если вам нужно время на 0:00, вам, конечно, понадобятся дополнительные усилия.