9.12.1 Problem
9.12.2 Solution
Use date( ) to find the current
time in the web server's time zone and loop through the days with mktime( ).
The following code generates option values for today
and the six days that follow. In this case, "today" is January 1, 2002.
list($hour, $minute, $second, $month, $day, $year) =
split(':', date('h:i:s:m:d:Y'));
// print out one week's worth of days
for ($i = 0; $i < 7; ++$i) {
$timestamp = mktime($hour, $minute, $second, $month, $day + $i, $year);
$date = date("D, F j, Y", $timestamp);
print "<option value=\"$timestamp\">$date</option>\n";
}
<option value="946746000">Tue, January 1, 2002</option>
<option value="946832400">Wed, January 2, 2002</option>
<option value="946918800">Thu, January 3, 2002</option>
<option value="947005200">Fri, January 4, 2002</option>
<option value="947091600">Sat, January 5, 2002</option>
<option value="947178000">Sun, January 6, 2002</option>
<option value="947264400">Mon, January 7, 2002</option>
9.12.3 Discussion
In the Solution, we set the value for each date as its
Unix timestamp representation because we find this easier to handle inside our
programs. Of course, you can use any format you find most useful and
appropriate.
Don't be tempted to eliminate the calls to mktime( );
dates and times aren't as consistent as you'd hope. Depending on what you're
doing, you might not get the results you want. For example:
$timestamp = mktime(0, 0, 0, 10, 24, 2002); // October 24, 2002
$one_day = 60 * 60 * 24; // number of seconds in a day
// print out one week's worth of days
for ($i = 0; $i < 7; ++$i) {
$date = date("D, F j, Y", $timestamp);
print "<option value=\"$timestamp\">$date</option>";
$timestamp += $one_day;
}
<option value="972619200">Fri, October 25, 2002</option>
<option value="972705600">Sat, October 26, 2002</option>
<option value="972792000">Sun, October 27, 2002</option>
<option value="972878400">Sun, October 27, 2002</option>
<option value="972964800">Mon, October 28, 2002</option>
<option value="973051200">Tue, October 29, 2002</option>
<option value="973137600">Wed, October 30, 2002</option>
This script should print out the month, day, and year for a
seven-day period starting October 24, 2002. However, it doesn't work as
expected.
Why are there two "Sun, October 27, 2002"s? The answer:
daylight saving time. It's not true that the number of seconds in a day stays
constant; in fact, it's almost guaranteed to change. Worst of all, if you're not
near either of the change-over dates, you're liable to miss this bug during
testing.