6

我需要在 php 中获取周数,其中应从星期日计算周数。默认情况下从星期一开始。请帮助我找到一种方法来获取周数,考虑星期天作为开始日。

在 php 手册 ISO-8601 年的周数中,从星期一开始的周数(在 PHP 4.1.0 中添加)

但我需要得到一年中的周数,从周日开始的周数。

谢谢

4

9 回答 9

5

尝试这个:

$week = intval(date('W'));

if (date('w') == 0) {            // 0 = Sunday
   $week++;
}

echo $week;

不确定逻辑是否正确;

于 2013-04-17T10:09:12.753 回答
4

第一个解决方案在 2017 年 1 月 1 日或从星期日开始的任何年份都不正确。

尝试这个:

$date = date('Y-m-d');
echo strftime("%U", strtotime($date ) );
于 2016-12-28T11:09:27.397 回答
3

扩展丝火答案并允许它缠绕多年

   if($date->format('w') == 0){
        if(date('W',strtotime($date->format('Y')."-12-31"))==52 and $date->format('W') == 52){
            $week = 1;
        }
        elseif(date('W',strtotime($date->format('Y')."-12-31"))==53 and $date->format('W') == 53){
            $week = 1;
        }
        else{
            $week++;
        }
    }
于 2016-11-16T21:39:48.260 回答
2

试试这个。要获得星期天必须-1 天。

$date = "2015-05-25";
echo date("W", strtotime("-1 day",strtotime($date)));
于 2015-05-26T04:33:12.987 回答
1

您应该尝试使用strftime

$week_start = new DateTime();
$week = strftime("%U");  //this gets you the week number starting Sunday
$week_start->setISODate(2012,$week,0); //return the first day of the week with offset 0
echo $week_start -> format('d-M-Y'); //and just prints with formatting 
于 2013-04-17T10:11:57.163 回答
1

我这样解决了这个问题:

function getWeekOfYear( DateTime $date ) {

        $dayOfweek = intval( $date->format('w') );

        if( $dayOfweek == 0 ) {
            $date->add(new DateInterval('P1D'));
        } 

        $weekOfYear = intval( $date->format('W') );

        return $weekOfYear;
}
于 2018-12-27T17:19:42.883 回答
0

我知道这个话题很老,但这是使用 elvis 运算符和 strtotime() 的“+7 天”表达式的一种更短的方法:

$week=date("W",strtotime(date("w")==1?"+7 day":"+0 day"));

如果 $date("w") 返回 true 表示今天是星期二和星期日 (1-6) 之间的一天,所以我们可以返回今天的星期 ('today')。

如果返回 false,则表示是星期一(0),所以,我们应该返回第二天('+1 周')。

这样我们就不需要关心一年的最后一天或第一天,也不需要检查当年是否有 52 周或 53 周。

已编辑:上一个答案(以及本主题中的其他答案)不适用于今年,因为 1 月 1 日是星期一,因此,它必须是 1 周前(-1 周),不包括星期日(第 6 天)。

date("W",strtotime(date("w")?'-7 day':'+0 day'));

我认为询问 1 月 1 日是否为星期一的条件可以工作,但我还没有测试它,我稍后会回来回答

对于自定义日,您可以使用以下命令:

$date = strtotime('2018-04-30'); // (it is monday)

if(date("w",strtotime(date('Y',$date).'-01-01'))==1){ // if first day of year is monday
    $week = strtotime(date('w',$date)?"-7 day":"+0 day",$date); // and today is sunday, sub a week
    $week = date("W",$week);
}else{ // if is not monday
    $week = strtotime(date('w',$date)==1?"+7 day":"+0 day",$date); // and today is monday, add a week
    $week = date("W",$week);
}
于 2018-04-30T19:20:34.520 回答
0

基于@silkfire 的回答:

    $year = date('Y');
    $week_no = date('W');
    if (date('w') == 0) {            // 0 = Sunday
       $week_no++;
    }
    // We shifted the week but the week still starts on a Monday.
    $weekStartDate = new DateTime();
    $weekStartDate->setISODate($year,$week_no);
    // Shift start date to Sunday
    $weekStartDate->add(DateInterval::createFromDateString('-1 day')); 
于 2018-05-20T20:24:55.267 回答
0

在 php 5.6 Debian 7 中测试

function getWeekNumber(\DateTime $_date)
{
    $week = intval($_date->format('W'));

    if(intval($_date->format('w')) == 0) {
        $week = intval($_date->format('W')) == ( 52 + intval($_date->format('L')) ) ? 1 : $week + 1;
    }

    return $week;
}
于 2018-12-07T17:19:04.950 回答