2014-12-04 46 views
1

我試圖找到一個簡單的解決方案來獲取日期範圍,特別是一週到一週結束的開始。如何獲得一週的開始和結束的全部範圍

我在這裏發現了一些非常複雜的解決方案。我想要一個雙線解決方案。 我認爲我的解決方案可能會幫助別人,所以我發佈了它。

回答

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開始。

對於結束日期,我使用next week的原理相同,但之後應用-1 second,這給了我們本週的第一秒和最後一秒。

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

就個人而言,我更喜歡這種類型的方法來傳遞一個「自然語言」類型串,對我來說,有模棱兩可的意思。

相關問題