2009-05-29 33 views
27

對於給定的一週開始和結束日期,我試圖讓使用星期日作爲開始日期的一週範圍,並參考日期,說$date,但我似乎無法弄清楚。獲得PHP

舉例來說,如果我有$日期2009-05-01,我會得到2009-04-26 2009-05-02和。 2009-05-10將產生2009-05-10和2009-05-16。我當前的代碼看起來像這樣(我不記得我是從舉起它,因爲我忘了放下網址在我的意見):

function x_week_range(&$start_date, &$end_date, $date) 
{ 
    $start_date = ''; 
    $end_date = ''; 
    $week = date('W', strtotime($date)); 
    $week = $week; 

    $start_date = $date; 

    $i = 0; 
    while(date('W', strtotime("-$i day")) >= $week) { 
     $start_date = date('Y-m-d', strtotime("-$i day")); 
     $i++; 
    } 

    list($yr, $mo, $da) = explode('-', $start_date); 

    $end_date = date('Y-m-d', mktime(0, 0, 0, $mo, $da + 6, $yr)); 
} 

我意識到它所作的只是增加7天當前日期。你會如何做到這一點?

回答

81

我想借此PHP的strtotime迷死advantange:

function x_week_range(&$start_date, &$end_date, $date) { 
    $ts = strtotime($date); 
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts); 
    $start_date = date('Y-m-d', $start); 
    $end_date = date('Y-m-d', strtotime('next saturday', $start)); 
} 

測試您所提供的數據和它的作品。不過,我並不特別喜歡你所做的全部參考。如果這是我的職責,我不得不說,它是這樣的:

function x_week_range($date) { 
    $ts = strtotime($date); 
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts); 
    return array(date('Y-m-d', $start), 
       date('Y-m-d', strtotime('next saturday', $start))); 
} 

,並調用它是這樣的:

list($start_date, $end_date) = x_week_range('2009-05-10'); 

我不是做數學這樣的事情的大風扇。日期是棘手的,我更喜歡讓PHP弄明白。

+2

的結束日期我用下面得到最後星期日日期格式: date('Ym-d',strtotime('last sunday')) – 2009-08-17 19:57:09

+3

給PHP5 DateTime類試試! – jjwdesign 2014-07-15 12:23:36

+0

@John M,如果今天是星期天,而你想要__this__星期,請參閱我的評論,關於「上個星期日」是如何產生問題的。 – cdmo 2016-02-29 13:18:05

0

說實話,我不太懂,你發佈的代碼;)

我想這樣的事情應該做的伎倆:

function get_week($date) { 
     $start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60; 
     $end = $start + 6 * 24 * 60 * 60; 
     return array('start' => strftime('%Y-%m-%d', $start), 
        'end' => strftime('%Y-%m-%d', $end)); 
} 
0

沒有做那麼多的字符串操作,你可以做一些簡單的數學時間戳。

function getDateRange(&$start, &$end, $date) { 
    $seconds_in_day = 86400; 
    $day_of_week = date("w", $date); 
    $start = $date - ($day_of_week * $seconds_in_day); 
    $end = $date + ((6 - $day_of_week) * $seconds_in_day); 
} 
2

這裏是我的版本,它採用了類似的概念來克萊:

/** 
* Start of the week 
* 
* 0 = Sun, 1 = Mon, etc. 
*/ 
define('WEEK_START', 0); 

/** 
* Determine the start and end dates for 
* the week in which the specified date 
* falls 
* 
* @param $date Date in week 
* @param $start Week start (out) 
* @param $end Week end (out) 
*/ 
function week_bounds($date, &$start, &$end) { 
    $date = strtotime($date); 
    // Find the start of the week, working backwards 
    $start = $date; 
    while(date('w', $start) > WEEK_START) { 
     $start -= 86400; // One day 
    } 
    // End of the week is simply 6 days from the start 
    $end = date('Y-m-d', $start + (6 * 86400)); 
    $start = date('Y-m-d', $start); 
} 

輕輕測試。代碼可能不是防彈的,或者處理過去或未來的日期。使用風險自負。不要將代碼浸入水中。不要將代碼顯示給那些神經質的人,或者對美元符號的仇恨。未在動物身上測試。素食者安全使用。作者保證,代碼永遠不會對你說話。如果代碼確實試圖讓你參與對話,作者建議你忽視它給出的任何和所有建議。

8

顯然「W」格式化日期的值()或DateTime對象的格式方法將返回一週中的一天作爲數(默認,0 =週日,1 =星期一,等等)

你可以把它從當天的天數中減去它的值,找到一週的開始。

$start_date = new DateTime("2009-05-13"); 
$day_of_week = $start_date->format("w"); 

$start_date->modify("-$day_of_week day"); 

$起始日期現在將等於一週的週日,從那裏你可以加7天拿到週末或什麼都有,你。

1

在試圖尋找由Paolo Bergantino接受答案的一個更精簡的版本,我發現了一個非常好的方式來完成這件事:

function x_week_range2($date) { 
    $ts = strtotime($date); 
    $start = strtotime('sunday this week -1 week', $ts); 
    $end = strtotime('sunday this week', $ts); 
    return array(date('Y-m-d', $start), date('Y-m-d', $end)); 
} 

的「週日本週字符串總是意味着「星期日在本週的結束。「如果在星期日的時間戳上使用,則將在下週日。這可以讓您避免在Paola解決方案中使用三元操作符。

18

對於每個仍在使用mktime(),strtotime()和其他PHP函數的人...嘗試使用PHP5 DateTime類。一開始我猶豫不決,但它使用起來非常簡單。不要忘記使用clone()來複制對象。

編輯:此代碼最近編輯爲處理當天是星期日的情況。在那種情況下,我們必須得到過去的星期六,然後再加上一天來獲得星期天。

$dt_min = new DateTime("last saturday"); // Edit 
$dt_min->modify('+1 day'); // Edit 
$dt_max = clone($dt_min); 
$dt_max->modify('+6 days'); 

然後根據需要格式化。

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')'; 

確保在您的代碼中儘早設置您的時區。

date_default_timezone_set('America/New_York'); 
3

基礎上@ jjwdesign的回答,我開發了可以計算的起始和使用DateTime類特定日期的一週結束的功能。 將工作在PHP 5.3.0 ++

區別在於你可以設置你想要作爲0(星期一)和6(星期日)之間的「開始」的一天。

這裏的功能:

if(function_exists('grk_Week_Range') === FALSE){ 
    function grk_Week_Range($DateString, $FirstDay=6){ 
     # Valeur par défaut si vide 
     if(empty($DateString) === TRUE){ 
      $DateString = date('Y-m-d'); 
     } 

     # On va aller chercher le premier jour de la semaine qu'on veut 
     $Days = array(
      0 => 'monday', 
      1 => 'tuesday', 
      2 => 'wednesday', 
      3 => 'thursday', 
      4 => 'friday', 
      5 => 'saturday', 
      6 => 'sunday' 
     ); 

     # On va définir pour de bon le premier jour de la semaine  
     $DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); 
     $DT_Max = clone($DT_Min); 

     # On renvoie les données 
     return array(
      $DT_Min->format('Y-m-d'), 
      $DT_Max->modify('+6 days')->format('Y-m-d') 
     ); 
    } 
} 

結果:

print_r(grk_Week_Range('2013-08-11 16:45:32', 0)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 1)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 2)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 3)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 4)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 5)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 6)); 

Array 
(
    [0] => 2013-07-29 
    [1] => 2013-08-04 
) 
Array 
(
    [0] => 2013-07-30 
    [1] => 2013-08-05 
) 
Array 
(
    [0] => 2013-07-31 
    [1] => 2013-08-06 
) 
Array 
(
    [0] => 2013-07-25 
    [1] => 2013-07-31 
) 
Array 
(
    [0] => 2013-07-26 
    [1] => 2013-08-01 
) 
Array 
(
    [0] => 2013-07-27 
    [1] => 2013-08-02 
) 
Array 
(
    [0] => 2013-07-28 
    [1] => 2013-08-03 
) 
-1

從PHP的DateTime DOC:

<?php 
$date = new DateTime(); 

$date->setISODate(2008, 2); 
$startDay = $date->format('Y-m-d'); 

$date->setISODate(2008, 2, 7); 
$endDay = $date->format('Y-m-d'); 
?> 
1

使用此功能可以在任何給定的日期得到了 「周」 號。

//October 29, 2009 is my birthday 
echo $week date('W', strtotime('2009-10-29')); 
//OUTPUT: 44 
//October 29 is the 44th week in the year 2009 

現在傳爲getWeekDates函數的參數爲​​ 「今年(2009年)」 和 「$周」。

function getWeekDates($year, $week, $start=true){ 
     $from = date("Y-m-d", strtotime("{$year}-W{$week}-1")); //Returns the date of monday in week 
     $to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); //Returns the date of sunday in week 

     if($start) { 
      return $from; 
     } else { 
      return $to; 
     } 
     //return "Week {$week} in {$year} is from {$from} to {$to}."; 
    } 

有關更多信息,請參考以下鏈接 http://blog.ekini.net/2009/07/09/php-get-start-and-end-dates-of-a-week-from-datew/

0

根據大衛·貝朗格的版本(可惜的是,我的名聲。不會讓我張貼的反應,他發表評論。)。

當輸入日期是星期一,星期幾設置爲星期一時,原始版本返回上一週,而不是當前。 這是一個小小的修復(與其餘的原始。功能):

if(function_exists('grk_Week_Range') === FALSE){ 
function grk_Week_Range($DateString, $FirstDay=6){ 

    if(empty($DateString) === TRUE){ 
     $DateString = date('Y-m-d'); 
    } 

    # fix 
    $dayOfWeek = date('N', strtotime($DateString)); 
    if ($dayOfWeek == ($FirstDay +1)) { $whichWeek = 'this '; } 
    else { $whichWeek = 'last '; } 

    $Days = array(
     0 => 'monday', 
     1 => 'tuesday', 
     2 => 'wednesday', 
     3 => 'thursday', 
     4 => 'friday', 
     5 => 'saturday', 
     6 => 'sunday' 
    ); 

    # fix 
    $DT_Min = new DateTime($whichWeek.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); 
    $DT_Max = clone($DT_Min); 

    return array(
     $DT_Min->format('Y-m-d'), 
     $DT_Max->modify('+6 days')->format('Y-m-d') 
    ); 
} 
} 
1

您現在可以使用日期時間得到啓動/周(S)

function getDateRangeForAllWeeks($start, $end){ 
    $fweek = getDateRangeForWeek($start); 
    $lweek = getDateRangeForWeek($end); 
    $week_dates = []; 
    while($fweek['sunday']!=$lweek['sunday']){ 
     $week_dates [] = $fweek; 
     $date = new DateTime($fweek['sunday']); 
     $date->modify('next day'); 

     $fweek = getDateRangeForWeek($date->format("Y-m-d")); 
    } 
    $week_dates [] = $lweek; 

    return $week_dates; 
} 

function getDateRangeForWeek($date){ 
    $dateTime = new DateTime($date); 
    $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); 
    $sunday = clone $dateTime->modify('Sunday this week'); 
    return ['monday'=>$monday->format("Y-m-d"), 'sunday'=>$sunday->format("Y-m-d")]; 
} 

使用

print_r(getDateRangeForWeek("2016-05-07")); 

print_r(getDateRangeForAllWeeks("2015-11-07", "2016-02-15"));