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

时间:2014-12-04 15:45:25

标签: php datetime range

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

我在这里找到了一些非常复杂的解决方案。我想要一个双线解决方案。 我认为我的解决方案可以帮助某人,所以我发布了它。

2 个答案:

答案 0 :(得分:1)

$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以获取该日期的开头。

this week获得本周开始之后,继承同一个,加上today,因此this week的开头成为that week的开头。< / p>

对于结束日期,我使用next week基于相同的原则,但之后应用了-1 second,这为我们提供了本周的第一个和最后一个秒。

答案 1 :(得分: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'));

就个人而言,我更喜欢这种方法来传递一种自然语言&#39;对我来说,类型字符串具有含糊不清的含义。