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

2022-08-30 09:12:06

我已经看到了这个问题的一些变体,但我相信这个问题还没有得到解答。

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

例:

输入:

getStartAndEndDate($week, $year);

输出:

$return[0] = $firstDay;
$return[1] = $lastDay;

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

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

我尝试过编辑现有的函数,这些函数几乎可以做我想做的事,但到目前为止我没有运气。

请帮帮我,提前感谢。


答案 1

使用日期时间类:

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

返回:

Array
(
    [week_start] => 2013-12-23
    [week_end] => 2013-12-29
)

解释:

  • 创建一个新的 DateTime 对象,该对象默认为 now()
  • 调用 setISODate 将对象更改为$year的$week的第一天,而不是 now()
  • 将日期格式化为“Y-m-d”并放入$ret['week_start']
  • 通过添加 6 天来修改对象,这将是$week
  • 将日期格式化为“Y-m-d”并放入$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;
}

可以在 >= php5.4 中通过实例化时使用类成员访问权限来缩短。


答案 2

很多年前,我发现了这个函数:

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

推荐