Louis W
Louis W

Reputation: 3252

Calculating week of specified date

Does PHP calculate weeks as being Sunday - Saturday? For a given date I am trying to determine the beginning and ending date of it's week as well as the beginning date of the next/previous weeks. Everything works fine unless I pass in a Sunday and it thinks the date is in a previous week.

$start  = $_GET['start'];
$year = date('Y', strtotime($start));
$week = date('W', strtotime($start));
$sunday = strtotime($year.'W'.$week.'0');

$next  = strtotime('+7 Days', $sunday);
$prev  = strtotime('-7 Days', $sunday);

echo '<p>week: ' . $week . '</p>';
echo '<p>sunday: ' . date('Y-m-d', $sunday) . '</p>';
echo '<p>next:' . date('Y-m-d', $next) . '</p>';
echo '<p>prev: ' . date('Y-m-d', $prev) . '</p>';

Outcome:

2011-01-09 (Sunday)
Week: 01
WRONG

2011-01-10 (Monday)
Week: 02
RIGHT

2011-01-15 (Saturday)
Week: 02
RIGHT

Upvotes: 0

Views: 3970

Answers (4)

Roger Russel
Roger Russel

Reputation: 759

The function date('W') uses the ISO-8601 definition, therefore Monday is the first day of the week.

In place of date('W') use strftime('%U').

Example:

$date = strtotime('2011-01-09');
echo strftime('%U',$date);

Outcome:

02

The code:

$date = strtotime('2012-05-06');
$sunday = date('Y-m-d', strtotime(strftime("%Y-W%U-0", $date)));
$sturday   = date('Y-m-d', strtotime(strftime("%Y-W%U-6", $date)));
echo $sunday . "\n";
echo $saturday;

Outcome:

2012-05-06
2012-05-12

Upvotes: 1

Ho&#224;ng Long
Ho&#224;ng Long

Reputation: 10848

As Dr.Molle point out, the information about "W" is correct. Your problem is here:

$sunday = strtotime($year.'W'.$week.'0');
$sunday = strtotime($year.'W'.$week.'0');

$next  = strtotime('+7 Days', $sunday);
$prev  = strtotime('-7 Days', $sunday);

Then you called strtotime on a Timestamp object (sorry, I don't know the exact term).

The wrong type of parameter (timestamp and string are used not correctly) is the cause of the problem. Here's my piece of code to determine the week and the beginning day of the week:

<?php
$date = '2011/09/09';

while (date('w', strtotime($date)) != 1) {

  $tmp = strtotime('-1 day', strtotime($date));
  $date = date('Y-m-d', $tmp);

}

$week = date('W', strtotime($date));

echo '<p>week: ' . $week . '</p>';

?>

To fully understand, you should take a look on date & strtotime manual.

Upvotes: 2

Dr.Molle
Dr.Molle

Reputation: 117314

As defined in ISO_8601, what date('W') refers to, a week starts with monday.

But be careful and read about the ISO-week: http://en.wikipedia.org/wiki/ISO_week_date

Maybe the result is not always like expected.

example:

date('W',mktime(0, 0, 0, 1, 1, 2011))

It will return 52 instead of 01, because the first ISO-week of a year is the first week with at least 4 days in the given year.
As 2011-1-1 was a saturday, there are only 2 days, so 2011-1-1 is in ISO in the last week of 2010(52) and not in the first week of 2011.

Upvotes: 1

deceze
deceze

Reputation: 522016

PHP doesn't think about weeks at all, if you're getting the wrong results, it's because your math is off. :)

$date = strtotime('2011-1-14');
$startingSunday   = strtotime('-' . date('w', $date) . ' days', $date);
$previousSaturday = strtotime('-1 day', $startingSunday);
$nextWeekSunday   = strtotime('+7 days', $startingSunday);

Upvotes: 2

Related Questions