Это не очень хорошо проверено, но, кажется, работает достаточно хорошо. Обратите внимание, что если $ start находится в выходные дни, а $ end - в тот же день недели, но раньше, дата, представленная $ end, будет опущена, поэтому в идеале отметки времени должны быть в полночь.
<?php
$start = $now = 1280293200; // starting time
$end = 1283014799; // ending time
$day = intval(date("N", $now));
$weekends = array();
if ($day < 6) {
$now += (6 - $day) * 86400;
}
while ($now <= $end) {
$day = intval(date("N", $now));
if ($day == 6) {
$weekends[] += $now;
$now += 86400;
}
elseif ($day == 7) {
$weekends[] += $now;
$now += 518400;
}
}
echo "Weekends from " . date("r", $start) . " to " . date("r", $end) . ":\n";
foreach ($weekends as $timestamp) {
echo date("r", $timestamp) . "\n";
}