Recipe 3.14. Generating Time Ranges


3.14.1. Problem

You need to know all the days in a week or a month. For example, you want to print out a list of appointments for a week.

3.14.2. Solution

Identify your start date using time( ) and strftime( ). If your interval has a fixed length, you can loop through that many days. If not, you need to test each subsequent day for membership in your desired range.

For example, a week has seven days, so you can use a fixed loop to generate all the days in the current week, as in Example 3-39.

Generating the days in a week

<?php // generate a time range for this week $now = time(); // If it's before 3 AM, increment $now, so we don't get caught by DST // when moving back to the beginning of the week if (3 < strftime('%H', $now)) { $now += 7200; } // What day of the week is today? $today = strftime('%w', $now); // How many days ago was the start of the week? $start_day = $now - (86400 * $today); // Print out each day of the week for ($i = 0; $i < 7; $i++) {   print strftime('%c',$start_day + 86400 * $i); } ?>

3.14.3. Discussion

A particular month or year could have a variable number of days, so you need to compute the end of the time range based on the specifics of that month or year. To loop through every day in a month, find the epoch timestamps for the first day of the month and the first day of the next month. In Example 3-40, the loop variable $day is incremented a day at a time (86,400 seconds) until it's no longer less than the epoch timestamp at the beginning of the next month.

Generating the days in a month

<?php // Generate a time range for this month $now = time(); // If it's before 3 AM, increment $now, so we don't get caught by DST // when moving back to the beginning of the month if (3 < strftime('%H', $now)) { $now += 7200; } // What month is this? $this_month = strftime('%m',$now); // Epoch timestamp for midnight on the first day of this month $day = mktime(0,0,0,$this_month,1); // Epoch timestamp for midnight on the first day of next month $month_end = mktime(0,0,0,$this_month+1,1); while ($day < $month_end) {   print strftime('%c',$day);   $day += 86400; } ?>

3.14.4. See Also

Documentation on time( ) at http://www.php.net/time and strftime( ) at http://www.php.net/strftime .




PHP Cookbook, 2nd Edition
PHP Cookbook: Solutions and Examples for PHP Programmers
ISBN: 0596101015
EAN: 2147483647
Year: 2006
Pages: 445

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net