2010-01-11 34 views
7

tôi cần phải ra một danh sách các ngày (chỉ các ngày thứ Hai và thứ Ba) trong 12 tháng tiếp theo kể từ ngày hiện tại như sau:Bắt tất cả các ngày cho các ngày thứ Hai và thứ Ba cho năm tiếp theo

tháng 1 năm 2010
Tue 12 Tháng 1 năm 2010
Môn ngày 18 tháng một năm 2010
Tue ngày 19 tháng một năm 2010
Mon 25 tháng 1 năm 2010
tháng 2 năm 2010
Tue ngày 02 tháng 2 năm 2010
Mon 08 tháng 2 2010 0.123. Tue 09 tháng hai năm 2010
Môn ngày 15 tháng 2 năm 2010
Tue 16 tháng 2 năm 2010
Mon 22 tháng hai năm 2010
tháng 3 năm 2010
Tue 09 tháng ba 2010
Mon 15 Tháng Ba 2010
Tue 16 Tháng Ba 2010
. ..

Làm quen với PHP Tôi đã tìm thấy strtotime và lặp lại trong 52 tuần tiếp theo là cách tốt nhất để đi.

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates 
$blockedDates = explode ("," , $blockedDatesInput); // convert to array 
$currentMonth = ""; // current month marker 

// loop over the next 52 weeks to find Mondays and Tuesdays 
for($i=0; $i<=52; $i++){ 
// build the month header 
$monthReference = date("M Y", strtotime('+'.$i.' Week')); 

// check if date exists in $blockeddate 
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates)) { 
    // check if we have to show a new month 
    if(strcmp($monthReference, $currentMonth) <> 0){ 
     echo $monthReference.'<br />',"\n"; 
    }else{ 
     // output the dates 
     echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n"; 
     echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n"; 
    } 
     $currentMonth = date("M Y", strtotime('+'.$i.' Week')); 
    } 
} 

Tuy nhiên sản lượng từ mã của tôi là

Tháng 1 2010
Mon 18 tháng 1 2010
Tue 12 Tháng 1 2010
Mon 25 Tháng 1 2010
Tue 19 Tháng 1 2010
tháng 2 năm 2010
Thứ Hai 08 tháng 2 năm 2010
Thứ Ba 02 tháng 2 năm 2010
Môn ngày 15 tháng 2 năm 2010
Tue 09 tháng hai 2010
Mon 22 Tháng Hai 2010
Tue 16 tháng 2 năm 2010
Tháng Ba 2010
Mon 08 Tháng ba 2010
Tue 02 tháng 3 năm 2010
Mon 15 Tháng Ba 2010
Tue 09 tháng ba 2010
Mon 22 Mar 2010
Thứ ba 16 Mar 2010
Thứ Hai 29 Mar 2010
Thứ Ba 23 Mar 2010

Như bạn có thể thấy ngày không theo thứ tự đúng và tôi đang thua lỗ ở nơi tôi đang sai ở đây.

Có cách nào thanh lịch/đơn giản hơn để giải quyết vấn đề này không?

Phiên bản PHP sử dụng là 5.2.11 và không có triển vọng sẽ 5.3 sớm :-(

Nhờ sự giúp đỡ của bạn.

Mã dưới đây sửa đổi theo đề nghị của Aly. Thay đổi ngày máy tính từ Thứ Ba, ngày 12/01/2010 đến thứ Tư, ngày 13/01/2010 để kiểm tra đầu ra.

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates 
$blockedDates = explode ("," , $blockedDatesInput); // convert to array 
$currentMonth = ""; // current month marker 

// loop over the next 52 weeks to find Mondays and Tuesdays 
for($i=0; $i<=52; $i++){ 
// build the month header 
$monthReference = date("M Y", strtotime('+'.$i.' Week')); 

// check if date exists in $blockeddate 
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates)) { 
    // check if we have to show a new month 
    if(strcmp($monthReference, $currentMonth) <> 0){ 
     echo $monthReference.'<br />',"\n"; 
    }else{ 
     // output the dates (changed the order as suggested by Aly) 
     echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n"; 
     echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";   
    } 
     $currentMonth = date("M Y", strtotime('+'.$i.' Week')); 
    } 
} 

Xuất lại theo thứ tự sai.

Tháng 1 2010
Tue 19 tháng 1 năm 2010
Mon 18 Tháng một 2010
Tue 26 Tháng 1 2010
Môn ngày 25 tháng 1 năm 2010
tháng 2 năm 2010
Tue 09 tháng hai 2010
Mon 08 Tháng hai 2010
Tuệ 16 Feb 2010
Mon 15 Feb 2010
Thứ Ba 23 tháng 2 năm 2010
Mon 22 Feb 2010

+0

vui lòng xem câu trả lời đã chỉnh sửa – Aly

Trả lời

10

Đây là một điều thú vị. Đây là cách tôi muốn làm điều đó với chức năng, mặc dù nó có thể đảm bảo lớp học riêng của mình để thực sự được mô-đun và tái sử dụng:

Set up my date formats and excluded dates 
define('INTERNAL_FORMAT', 'Y-m-d'); 
define('DISPLAY_MONTH_FORMAT', 'M Y'); 
define('DISPLAY_DAY_FORMAT', 'D d M Y'); 
// format excluded dates as YYYY-MM-DD, date('Y-m-d'): 
$excluded_dates = array(
    '2010-03-09', 
    '2010-04-13', 
); 

Sau đó, tôi cần một số chức năng tiện ích để xem làm thế nào những ngày chạy và những ngày bị loại trừ:

// date('w') returns a string numeral as follows: 
// '0' Sunday 
// '1' Monday 
// '2' Tuesday 
// '3' Wednesday 
// '4' Thursday 
// '5' Friday 
// '6' Saturday 
function isTuesday($date) { 
    return date('w', strtotime($date)) === '2'; 
} 
function isWednesday($date) { 
    return date('w', strtotime($date)) === '3'; 
} 

// handle the excluded dates 
function isExcludedDate($internal_date) { 
    global $excluded_dates; 
    return in_array($internal_date, $excluded_dates); 
} 

Bây giờ chúng tôi chỉ cần lặp lại mỗi ngày của 365 tiếp theo (năm tiếp theo) và kiểm tra xem chúng là thứ ba hoặc thứ tư và không có trong danh sách bị loại trừ. Chúng tôi lưu trữ này trong $months_and_dates:

$start_date = date(INTERNAL_FORMAT); 

// something to store months and days 
$months_and_dates = array(); 

// loop over 365 days and look for tuesdays or wednesdays not in the excluded list 
foreach(range(0,365) as $day) { 
    $internal_date = date(INTERNAL_FORMAT, strtotime("{$start_date} + {$day} days")); 
    $this_day = date(DISPLAY_DAY_FORMAT, strtotime($internal_date)); 
    $this_month = date(DISPLAY_MONTH_FORMAT, strtotime($internal_date)); 
    if ((isTuesday($internal_date) || isWednesday($internal_date)) 
     && !isExcludedDate($internal_date)) { 
      $months_and_dates[$this_month][] = $this_day; 
    } 
} 

Bạn có thể print_r() nó, hoặc để có được những màn hình mà bạn muốn, chúng tôi làm điều này:

foreach($months_and_dates as $month => $days) { 
    print $month . "<br>"; 
    print implode('<br>', $days); 
    print "<br>"; 
} 

Dưới đây là kết quả tính đến ngày hôm nay, 11 tháng một năm 2010:

Jan 2010 
Tue 12 Jan 2010 
Wed 13 Jan 2010 
Tue 19 Jan 2010 
Wed 20 Jan 2010 
Tue 26 Jan 2010 
Wed 27 Jan 2010 
Feb 2010 
Tue 02 Feb 2010 
Wed 03 Feb 2010 
Tue 09 Feb 2010 
Wed 10 Feb 2010 
Tue 16 Feb 2010 
Wed 17 Feb 2010 
Tue 23 Feb 2010 
Wed 24 Feb 2010 
Mar 2010 
Tue 02 Mar 2010 
Wed 03 Mar 2010 
Wed 10 Mar 2010 
Tue 16 Mar 2010 
Wed 17 Mar 2010 
Tue 23 Mar 2010 
Wed 24 Mar 2010 
Tue 30 Mar 2010 
Wed 31 Mar 2010 
Apr 2010 
Tue 06 Apr 2010 
Wed 07 Apr 2010 
Wed 14 Apr 2010 
Tue 20 Apr 2010 
Wed 21 Apr 2010 
Tue 27 Apr 2010 
Wed 28 Apr 2010 
May 2010 
Tue 04 May 2010 
Wed 05 May 2010 
Tue 11 May 2010 
Wed 12 May 2010 
Tue 18 May 2010 
Wed 19 May 2010 
Tue 25 May 2010 
Wed 26 May 2010 
Jun 2010 
Tue 01 Jun 2010 
Wed 02 Jun 2010 
Tue 08 Jun 2010 
Wed 09 Jun 2010 
Tue 15 Jun 2010 
Wed 16 Jun 2010 
Tue 22 Jun 2010 
Wed 23 Jun 2010 
Tue 29 Jun 2010 
Wed 30 Jun 2010 
Jul 2010 
Tue 06 Jul 2010 
Wed 07 Jul 2010 
Tue 13 Jul 2010 
Wed 14 Jul 2010 
Tue 20 Jul 2010 
Wed 21 Jul 2010 
Tue 27 Jul 2010 
Wed 28 Jul 2010 
Aug 2010 
Tue 03 Aug 2010 
Wed 04 Aug 2010 
Tue 10 Aug 2010 
Wed 11 Aug 2010 
Tue 17 Aug 2010 
Wed 18 Aug 2010 
Tue 24 Aug 2010 
Wed 25 Aug 2010 
Tue 31 Aug 2010 
Sep 2010 
Wed 01 Sep 2010 
Tue 07 Sep 2010 
Wed 08 Sep 2010 
Tue 14 Sep 2010 
Wed 15 Sep 2010 
Tue 21 Sep 2010 
Wed 22 Sep 2010 
Tue 28 Sep 2010 
Wed 29 Sep 2010 
Oct 2010 
Tue 05 Oct 2010 
Wed 06 Oct 2010 
Tue 12 Oct 2010 
Wed 13 Oct 2010 
Tue 19 Oct 2010 
Wed 20 Oct 2010 
Tue 26 Oct 2010 
Wed 27 Oct 2010 
Nov 2010 
Tue 02 Nov 2010 
Wed 03 Nov 2010 
Tue 09 Nov 2010 
Wed 10 Nov 2010 
Tue 16 Nov 2010 
Wed 17 Nov 2010 
Tue 23 Nov 2010 
Wed 24 Nov 2010 
Tue 30 Nov 2010 
Dec 2010 
Wed 01 Dec 2010 
Tue 07 Dec 2010 
Wed 08 Dec 2010 
Tue 14 Dec 2010 
Wed 15 Dec 2010 
Tue 21 Dec 2010 
Wed 22 Dec 2010 
Tue 28 Dec 2010 
Wed 29 Dec 2010 
Jan 2011 
Tue 04 Jan 2011 
Wed 05 Jan 2011 
Tue 11 Jan 2011 
+0

artlung nhờ sự giúp đỡ của bạn. Khá một chút phức tạp hơn tôi nghĩ trong đầu. Nhằm mục đích nó có ý nghĩa. Trong Java Tôi-đã giải quyết nó thông qua một hashmap là tốt. thứ php này là rất ngoại với tôi :-) Cảm ơn một lần nữa – interrogativus

+0

câu trả lời tuyệt vời, cảm ơn nhiều! không có – Bear

+0

Là một giải pháp với Javascript? –

0

trong một sự trùng hợp ngẫu nhiên, bởi vì hôm nay là thứ hai, nó bỏ qua một giá trị thứ hai, đó là lý do tại sao chúng xuất hiện không đúng thứ tự. ngày hôm qua nó sẽ làm việc tốt.

tức là "+ 0 Thứ Hai" của bạn là Thứ Hai, không phải hôm nay.

bạn có thể muốn xem ký tự định dạng "N" cho ngày().

+0

thực sự ở cổ của tôi rừng đã là Thứ Ba :-) Nhưng chuỗi ngày tháng là sai. Tôi đoán mũ là những gì tôi yêu cầu. – interrogativus

0

Ok giờ là ngày máy tính của bạn là Thứ Tư bạn muốn in Thứ Hai trước Thứ Ba khi Thứ Hai tới gần Thứ Tư hơn Thứ Ba tới. Vì vậy, hãy thử điều này:

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates 
$blockedDates = explode ("," , $blockedDatesInput); // convert to array 
$currentMonth = ""; // current month marker 

// loop over the next 52 weeks to find Mondays and Tuesdays 
for($i=0; $i<=52; $i++){ 
// build the month header 
$monthReference = date("M Y", strtotime('+'.$i.' Week')); 

// check if date exists in $blockeddate 
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates)) { 
    // check if we have to show a new month 
    if(strcmp($monthReference, $currentMonth) <> 0){ 
     echo $monthReference.'<br />',"\n"; 
    }else{ 
     // output the dates (changed the order as suggested by Aly) 
     echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";   
     echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n"; 
    } 
     $currentMonth = date("M Y", strtotime('+'.$i.' Week')); 
    } 
} 
+0

Tôi đã thay đổi trình tự như bạn đã đề xuất và sau đó thay đổi ngày PC của tôi thành ngày mai (ngày 13 tháng 1 năm 2010) và đầu ra lại sai. Vì vậy, tôi thiếu một cái gì đó cơ bản ở đây, tôi đoán.

Tháng 1 2010
Tue 19 tháng 1 năm 2010
My 18 Tháng một 2010
Tue 26 tháng 1 năm 2010
My 25 tháng 1 2010
tháng 2 năm 2010
Tue 09 Tháng 2 năm 2010
My 08 tháng hai năm 2010
Tue 16 tháng 2 2010
My 15 Tháng 2 2010
Tue 23 tháng 2 năm 2010
Mon 22 Tháng 2 2010 01.235.164

interrogativus

+0

tại sao bạn thay đổi ngày aussi máy tính của bạn làm cái này hay cái khác - bạn có thể chỉnh sửa bài viết của bạn với mã mới của bạn và thời gian hiện tại máy tính của bạn đang hiển thị – Aly

Các vấn đề liên quan