Php 如何获得一周的开始和结束的完整跨度

Php 如何获得一周的开始和结束的完整跨度,php,datetime,range,Php,Datetime,Range,我试图找到一个简单的解决方案来确定日期范围,特别是从一周的开始到一周的结束 我在这里找到了一些非常复杂的解决方案。我想要一个两行的解决方案。 我想我的解决方案可能会对某人有所帮助,所以我把它贴了出来 $date = new \DateTime(/* any point in time and space */); $week_start = new \DateTime(sprintf('%s today this week', $date->format('Y-m-d

我试图找到一个简单的解决方案来确定日期范围,特别是从一周的开始到一周的结束

我在这里找到了一些非常复杂的解决方案。我想要一个两行的解决方案。 我想我的解决方案可能会对某人有所帮助,所以我把它贴了出来

$date = new \DateTime(/* any point in time and space */);

$week_start = new \DateTime(sprintf('%s today this week',           $date->format('Y-m-d H:i:s')));
$week_end   = new \DateTime(sprintf('%s today next week -1 second', $date->format('Y-m-d H:i:s')));

echo sprintf('%s -> %s', $week_start->format('Y-m-d H:i:s'), $week_end->format('Y-m-d H:i:s'));
PHP的英文日期表达式的一个经常被忽略的特性是,如何在可能出现冲突的表达式中相互继承单词和日期

但是,您可以添加多个表达式,每个表达式都将继承上一个表达式。 因此,通过在表达式开始处添加特定日期并对其进行格式化,您可以添加
today
以获取该日期的开始

在此之后,
本周
要获得本周的开始,将继承相同的,再加上
今天
,因此
本周的开始
将成为
该周的开始


对于结束日期,我根据相同的原则使用了下周的
,但随后应用了
-1秒,这给了我们一周的第一秒和最后一秒。

另一种方法可以得到相同的结果:-

$sunday = 0;
$monday = 1;
$date = new \DateTime(/* any point in time and space */);

$weekStart = (new \DateTime())->setISODate((int)$date->format('o'), (int)$date->format('W'), $monday)->setTime(0, 0, 0);
$weekEnd = (new \DateTime())->setISODate((int)$date->format('o'), (int)$date->format('W') + 1, $sunday)->setTime(23, 59, 59);

echo sprintf('%s -> %s', $weekStart->format('Y m d H:i:s'), $weekEnd->format('Y m d H:i:s'));
就我个人而言,我更喜欢这种类型的方法,而不是传递一个“自然语言”类型的字符串,在我看来,它的含义是模糊的