PHP按周数获取一周的开始和结束日期

Pie*_*888 46 php date

我已经看到了这个问题的一些变种,但我相信这个还没有得到回答.

我需要得到一周的开始日期和结束日期,按年份和周数选择(不是日期)

例:

输入:

getStartAndEndDate($week, $year);
Run Code Online (Sandbox Code Playgroud)

输出:

$return[0] = $firstDay;
$return[1] = $lastDay;
Run Code Online (Sandbox Code Playgroud)

返回值将类似于一个数组,其中第一个条目是星期开始日期,第二个条目是结束日期.

可选:当我们在它时,日期格式需要是Y-n-j(正常日期格式,没有前导零.

我已经尝试编辑几乎完成我想要的现有功能,但到目前为止我没有运气.

请帮助我,提前谢谢.

小智 152

使用DateTime类:

function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $dto->setISODate($year, $week);
  $ret['week_start'] = $dto->format('Y-m-d');
  $dto->modify('+6 days');
  $ret['week_end'] = $dto->format('Y-m-d');
  return $ret;
}

$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
Run Code Online (Sandbox Code Playgroud)

返回:

Array
(
    [week_start] => 2013-12-23
    [week_end] => 2013-12-29
)
Run Code Online (Sandbox Code Playgroud)

解释:

  • 创建一个默认为now()的新DateTime对象
  • 调用setISODate将对象更改为$ year的$ week的第一天而不是now()
  • 格式化日期为'Ymd'并放入$ ret ['week_start']
  • 通过添加6天来修改对象,这将是$ week的结束
  • 格式化日期为'Ymd'并放入$ ret ['week_end']

更短的版本(在> = php5.3中工作):

function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $ret['week_start'] = $dto->setISODate($year, $week)->format('Y-m-d');
  $ret['week_end'] = $dto->modify('+6 days')->format('Y-m-d');
  return $ret;
}
Run Code Online (Sandbox Code Playgroud)

可以通过> = php5.4中的实例化来缩短类成员访问权限.

  • 这应该是接受的答案,放下手.它更快,更干净,并使用内部DateTime()类. (9认同)
  • 因为有时我们需要这个用于mysql,我们也需要时间.所以我稍微修改了一下.重置时间,添加7天,减少1秒.$ dto = new DateTime(); $ dto-> setISODate($ year,$ week); $ dto->时刻设定(0,0,0); $ ret ['week_start'] = $ dto-> format('Ymd H:i:s'); $ dto-> modify('+ 7天'); $ dto-> modify(' - 1 sec'); $ ret ['week_end'] = $ dto-> format('Ymd H:i:s'); (2认同)

Roh*_*fii 42

很多年前,我发现了这个功能:

function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $dto->setISODate($year, $week);
  $ret['week_start'] = $dto->format('Y-m-d');
  $dto->modify('+6 days');
  $ret['week_end'] = $dto->format('Y-m-d');
  return $ret;
}

$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
Run Code Online (Sandbox Code Playgroud)

  • 计算不正确.2014年第1周是从"2013-12-30"到"2014-01-05",而不是从"2014-01-06"到"2014-01-12",这实际上是第2周. (10认同)
  • 这不应该被接受,因为这是错误的.今天2017-01-01是2016年的第52周,因为2016年是闰年.所以这个方法的函数将返回错误的日期. (6认同)
  • 事实上,这将持续一周. (3认同)

小智 14

我们可以轻松实现这一目标,而无需额外的计算,除了DateTime类固有的计算.

function getStartAndEndDate($year, $week)
{
   return [
      (new DateTime())->setISODate($year, $week)->format('Y-m-d'), //start date
      (new DateTime())->setISODate($year, $week, 7)->format('Y-m-d') //end date
   ];
}
Run Code Online (Sandbox Code Playgroud)

setISODate()函数有三个参数:$year,$week$day,$day默认为1 - 一周的第一天.因此,我们通过7来获得第7天的确切日期$week.


小智 10

使用"[year] W [week] [day]"strtotime格式的稍微整洁的解决方案:

function getStartAndEndDate($week, $year) {
  // Adding leading zeros for weeks 1 - 9.
  $date_string = $year . 'W' . sprintf('%02d', $week);
  $return[0] = date('Y-n-j', strtotime($date_string));
  $return[1] = date('Y-n-j', strtotime($date_string . '7'));
  return $return;
}
Run Code Online (Sandbox Code Playgroud)


Cla*_*nga 6

最短的方法:

function week_date($week, $year){
    $date = new DateTime();
    return "first day of the week is ".$date->setISODate($year, $week, "1")->format('Y-m-d')
    ."and last day of the week is ".$date->setISODate($year, $week, "7")->format('Y-m-d'); 
}
echo week_date(12,2014);
Run Code Online (Sandbox Code Playgroud)