计算指定日期的周数

时间:2011-01-14 02:22:30

标签: php

PHP计算周数是星期六 - 星期六吗?对于给定的日期,我试图确定它的周的开始和结束日期以及下一周/前几周的开始日期。一切正常,除非我通过一个星期天,它认为日期是在前一周。

$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>';

结果:

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

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

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

4 个答案:

答案 0 :(得分:2)

PHP根本没有考虑几周,如果你得到了错误的结果,那是因为你的数学是关闭的。 :)

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

答案 1 :(得分:2)

正如Dr.Molle指出的那样,关于“W”的信息是正确的。你的问题在这里:

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

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

然后你在Timestamp对象上调用了strtotime(对不起,我不知道具体的术语)。

错误的参数类型(时间戳和字符串使用不正确)是问题的原因。这是我确定一周和一周开始日的代码:

<?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>';

?>

要完全理解,您应该查看date&amp; strtotime手册。

答案 2 :(得分:1)

正如ISO_8601中所定义的,date('W')所指的是,一周以星期一开头。

但请注意并阅读ISO周:http://en.wikipedia.org/wiki/ISO_week_date

也许结果并不总是像预期的那样。

示例:

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

它将返回52而不是01,因为一年中的第一个ISO周是给定年份中至少4天的第一周。
由于2011-1-1是星期六,只有2天,所以2011-1-1在2010年的最后一周(52)是ISO,而不是2011年的第一周。

答案 3 :(得分:1)

功能日期('W')使用ISO-8601定义,因此星期一是一周的第一天。

代替日期('W')使用strftime('%U')。

示例:

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

结果:

02

代码:

$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;

结果:

2012-05-06
2012-05-12