tags:

views:

73

answers:

3

Hi, I'm trying to use PHP to create a script that searches all the days between now and one year's time and lists all the dates for Fridays and Saturdays. I was trying to use PHP's date() and mktime() functions but can't think of a way of doing this. Is it possible?

Thanks, Ben

+4  A: 

Here's how to do it in a cool way, with special thanks to strtotime's relative formats.

$friday = strtotime('Next Friday', time());
$saturday = strtotime('Next Saturday', time());
$friday = strtotime('+1 Week', $friday);
$saturday = strtotime('+1 Week', $saturday);

Of course you should tweak it to do exactly what you want, but that's beside the point I was trying to make.

Also note that strtotime will give you timestamps. To find out the date use:

date('Y-m-d', $friday)

Another thing to know is that Next <dayofweek> will exclude your current day from the search, so if you also want to include the current day you can do it like this:

$friday = strtotime('Next Friday', strtotime('-1 Day', time()));

And here's a full working script that does exactly what you wanted.

<?php
// prevent multiple calls by retrieving time once //
$now = time();
$aYearLater = strtotime('+1 Year', $now);

// fill this with dates //
$allDates = Array();

// init with next friday and saturday //
$friday = strtotime('Next Friday', strtotime('-1 Day', $now));
$saturday = strtotime('Next Saturday', strtotime('-1 Day', $now));

// keep adding days untill a year has passed //
while(1){
    if($friday > $aYearLater)
        break 1;
    $allDates[] = date('Y-m-d', $friday);
    if($saturday > $aYearLater)
        break 1;
    $allDates[] = date('Y-m-d', $saturday);

    $friday = strtotime('+1 Week', $friday);
    $saturday = strtotime('+1 Week', $saturday);
}

//XXX: debug
var_dump($allDates);

?>

Good luck, Alin

Alin Purcaru
Benchmark: ~0.011s
Alin Purcaru
A: 
$secondsperday=86400;

$firstdayofyear=mktime(12,0,0,1,1,2010);
$lastdayofyear=mktime(12,0,0,12,31,2010);

$theday = $firstdayofyear;

for($theday=$firstdayofyear; $theday<=$lastdayofyear; $theday+=$secondsperday) {
    $dayinfo=getdate($theday);
    if($dayinfo['wday']==5 or $dayinfo['wday']==6) {
        print $dayinfo['weekday'].' '.date('Y-m-d',$theday)."<br />";
    }
}
Spudley
Calculations that use 86400 take for granted that all days have 24 hours, which is not always the case. Next Saturday has 25 hours in Spain due to daylight saving time.
Álvaro G. Vicario
Benchmark: ~0.006s
Alin Purcaru
Also note that daylight saving rules varies greatly across the world. This is why you should use the built in language features when manipulating time.
Alin Purcaru
Daylight saving evens out over the course of a year. Wherever you are, it always comes into effect in the middle of the night, so best not to use midnight as your baseline, but other than that for this purpose you should be safe adding 86400.
Spudley
+1  A: 

With DateTime objects:

<?php

define('FRIDAY', 5);
define('SATURDAY', 6);

$from = new DateTime;
$to = new DateTime('+1 year');

for($date=clone $from; $date<$to; $date->modify('+1 day')){
    switch($date->format('w')){
        case FRIDAY:
        case SATURDAY:
            echo $date->format('r') . PHP_EOL;
    }
}

Update: I've added the $date=clone $from part to remark that objects in PHP/5 are no longer copied with the = operator but referenced.

Álvaro G. Vicario
Benchmark: ~0.006s
Alin Purcaru