2011-09-13 55 views
4

我期望使用PHP列出給定年份中所有星期五的日期。在PHP中獲取所有星期五的日期

閱讀php.net日期和MAKETIME功能後,我看不出我應該如何開始......

你們能給我一隻手在此?

謝謝, Crak這樣做會發現今年的第一個星期五

回答

5

一種方法,將它添加到一個數組,然後在一個循環由7遞增,增加每增加一個週五的陣列中,直至這一年不再匹配。

<?php 
function getFridaysForYear($y) { 
    date_default_timezone_set('America/New_York'); 

    $fridays = array(); 
    $dt = strtotime("{$y}-01-01 Friday"); // Black magic :-) 
    $wk = 0; 
    $d = date('j', $dt); 

    while ($wk < 52) { 
     $fridays[] = $dt; 
     $wk++; 
     $d += 7; 
     $dt = mktime(0, 0, 0, 1, $d, $y); 
    } 

    return $fridays; 
} 
+1

+1會工作,但肯定應該有一個巧妙的方法。 –

4

這個循環他們,從下週五(在這種情況下,13 2011年9月):

$given_year = strtotime(2011); 
$for_start = strtotime('Friday', $given_year); 
$for_end = strtotime('+1 year', $given_year); 
for ($i = $for_start; $i <= $for_end; $i = strtotime('+1 week', $i)) { 
    echo date('l Y-m-d', $i) . '<br />'; 
} 

[View output]

而這一次從年初開始循環:

$given_year = strtotime("1 January 2011"); 
$for_start = strtotime('Friday', $given_year); 
$for_end = strtotime('+1 year', $given_year); 
for ($i = $for_start; $i <= $for_end; $i = strtotime('+1 week', $i)) { 
    echo date('l Y-m-d', $i) . '<br />'; 
} 

[View output]

+1

** PS:**非常酷和具有挑戰性的問題^^ –

+0

+1好的解決方案。小的批評:我會預先計算'for'的條件,因爲它在每次迭代中被一次又一次地計算,這是不必要的。 –

+0

@fireeyedboy:好點。我更新了我的答案,那是你的意思? –

6

我相信DatePeriod可能會爲這樣的問題而制定的。

<?php 
function getFridays($year, $format, $timezone='UTC') 
{ 
    $fridays = array(); 
    $startDate = new DateTime("{$year}-01-01 Friday", new DateTimezone($timezone)); 
    $year++; 
    $endDate = new DateTime("{$year}-01-01", new DateTimezone($timezone)); 
    $int = new DateInterval('P7D'); 
    foreach(new DatePeriod($startDate, $int, $endDate) as $d) { 
     $fridays[] = $d->format($format); 
    } 

    return $fridays; 
} 

$fridays = getFridays('2010', 'F j, Y, g:i a T', 'America/New_York'); 
print_r($fridays); 
?> 

輸出

Array 
(
    [0] => Friday, January 1, 2010 
    [1] => Friday, January 8, 2010 
    [2] => Friday, January 15, 2010 
    [3] => Friday, January 22, 2010 
    [4] => Friday, January 29, 2010 
    [5] => Friday, February 5, 2010 
    [6] => Friday, February 12, 2010 
    [7] => Friday, February 19, 2010 
    [8] => Friday, February 26, 2010 
    [9] => Friday, March 5, 2010 
    [10] => Friday, March 12, 2010 
    [11] => Friday, March 19, 2010 
    [12] => Friday, March 26, 2010 
    [13] => Friday, April 2, 2010 
    [14] => Friday, April 9, 2010 
    [15] => Friday, April 16, 2010 
    [16] => Friday, April 23, 2010 
    [17] => Friday, April 30, 2010 
    [18] => Friday, May 7, 2010 
    [19] => Friday, May 14, 2010 
    [20] => Friday, May 21, 2010 
    [21] => Friday, May 28, 2010 
    [22] => Friday, June 4, 2010 
    [23] => Friday, June 11, 2010 
    [24] => Friday, June 18, 2010 
    [25] => Friday, June 25, 2010 
    [26] => Friday, July 2, 2010 
    [27] => Friday, July 9, 2010 
    [28] => Friday, July 16, 2010 
    [29] => Friday, July 23, 2010 
    [30] => Friday, July 30, 2010 
    [31] => Friday, August 6, 2010 
    [32] => Friday, August 13, 2010 
    [33] => Friday, August 20, 2010 
    [34] => Friday, August 27, 2010 
    [35] => Friday, September 3, 2010 
    [36] => Friday, September 10, 2010 
    [37] => Friday, September 17, 2010 
    [38] => Friday, September 24, 2010 
    [39] => Friday, October 1, 2010 
    [40] => Friday, October 8, 2010 
    [41] => Friday, October 15, 2010 
    [42] => Friday, October 22, 2010 
    [43] => Friday, October 29, 2010 
    [44] => Friday, November 5, 2010 
    [45] => Friday, November 12, 2010 
    [46] => Friday, November 19, 2010 
    [47] => Friday, November 26, 2010 
    [48] => Friday, December 3, 2010 
    [49] => Friday, December 10, 2010 
    [50] => Friday, December 17, 2010 
    [51] => Friday, December 24, 2010 
    [52] => Friday, December 31, 2010 
) 
相關問題