2013-06-11 69 views
7

Cách tìm Thứ Bảy thứ 2 và thứ 4 của tháng. tôi viết những dòng này: -Tìm ngày thứ bảy và thứ tư của tháng

echo "may 2nd sat ".date('d', strtotime('may 2013 second saturday')); 
echo '<br/>may 4th sat '.date('d', strtotime('may 2013 fourth saturday'));         
echo '<br/>june 2nd sat '.date('d', strtotime('june 2013 second saturday')); 
echo '<br/>june 4th sat '.date('d', strtotime('june 2013 fourth saturday')); 

Nó cho kết quả như sau: -

may 2nd sat 11 
may 4th sat 25 
june 2nd sat 15 
june 4th sat 29 

Nó cung cấp cho câu trả lời đúng trong may tháng nhưng không june 2013, trong jun 1013 thứ bảy thứ 2 và thứ 4 nên là 8 và 22 tương ứng. Làm thế nào tôi có thể giải quyết vấn đề này.

Trả lời

7

Tôi không chắc chắn lý do tại sao bạn sẽ không hoạt động, nhưng cố gắng này, nó làm việc cho tôi:

echo '<br/>june 2nd sat '.date('d', strtotime('second sat of june 2013')); 
echo '<br/>june 4th sat '.date('d', strtotime('fourth sat of june 2013')); 

Nó dựa trên ví dụ "first sat of July 2008" trong PHP manual page

+0

Liên kết ở trên không hoạt động cho tôi. Sử dụng cái này thay vào đó: http://ca1.php.net/manual/en/datetime.formats.relative.php – Stan

+0

Cảm ơn, tôi đã cập nhật liên kết – periklis

1

Những ngày này phương pháp ưa thích của tôi là mở rộng của PHP DateTime object: -__

class MyDateTime extends DateTime 
{ 
    /** 
    * Returns a MyDateTime object set to 00:00 hours on the nth occurence 
    * of a given day of the month 
    * 
    * @param string $n nth day required, eg first, second etc 
    * @param string $day Name of day 
    * @param mixed $month Month number or name optional defaults to current month 
    * @param mixed $year optional defaults to current year 
    * 
    * @return MyDateTime set to last day of month 
    */ 
    public function nthDayOfMonth($n, $day, $month = null, $year = null) 
    { 
     $timestr = "$n $day"; 
     if(!$month) $month = $this->format('M'); 
     $timestr .= " of $month $year"; 
     $this->setTimestamp(strtotime($timestr)); 
     $this->setTime(0, 0, 0); 
     return $this; 
    } 
} 
$dateTime = new MyDateTime(); 
echo $dateTime->nthDayOfMonth('second', 'Sun', 'Jul', 2011)->format('Y-m-d'); 

Output: -

2011-07-10 
4

Tôi không biết lý do tại sao nó được gây ra lỗi này howver tôi đã tìm thấy giải pháp làm thế nào để có được câu trả lời đúng

echo date('d',strtotime('+1 week sat may 2013')).'<BR>'; 
echo date('d',strtotime('+3 week sat may 2013')).'<BR>'; 
echo date('d',strtotime('+1 week sat june 2013')).'<BR>'; 
echo date('d',strtotime('+3 week sat june 2013')).'<BR>'; 

Giải pháp này hoạt động tốt và cho thấy kết quả phù hợp.

Output:

11 
25 
08 
22 
1

Sau đó, bạn phải chạy một phiên bản PHP dưới phiên bản 5.2.7, như manual states

Trong PHP 5 trước 5.2.7, yêu cầu trao sự xuất hiện của một ngày trong tuần nhất định trong tháng mà ngày trong tuần đó là ngày đầu tiên của tháng sẽ thêm một tuần vào dấu thời gian trả về không chính xác. Điều này đã được sửa chữa trong phiên bản 5.2.7 và các phiên bản mới hơn.

Vì vậy, nếu bạn có thể cập nhật phiên bản PHP sẽ là giải pháp tốt nhất. Khác bạn có thể kiểm tra một cái gì đó như thế nào.

<?php 
function showDay($month, $year, $day, $count) 
{ 
    $list = array(1=>'first',2=>'second',3=>'third',4=>'fourth',5=>'fifth'); 
    $first = date('d', strtotime($month . ' ' . $year . ' ' . $list[1] .' '.$day)); 
    $show= ($first>7) ? $count-1 : $count; 
    return date('d', strtotime($month . ' ' . $year . ' ' . $list[$show] .' '.$day)); 
} 

echo '<br/>june 2nd sat '.showDay('june', 2013, 'saturday', 2); 
?> 
+0

OP được gắn thẻ là 'php-5.4'. Tuy nhiên, đó là thông tin hữu ích, tốt để biết – periklis

1

Tôi thường không dựa vào một đoạn chuỗi. Làm thế nào về một chức năng tùy chỉnh-thực hiện?

function getSaturdayDay($year, $month, $position) { 
    $firstDay = date('w', mktime(0, 0, 0, $month, 1, $year)); 
    $diff = 6 - $firstDay; 

    return 1 + $diff + $position * 7; 
} 

và sử dụng nó trong ngữ cảnh của bạn

echo "may 2nd sat " . getSaturdayDay(2013, 5, 1); 
echo '<br/>may 4th sat ' . getSaturdayDay(2013, 5, 3);       
echo '<br/>june 2nd sat ' . getSaturdayDay(2013, 6, 1); 
echo '<br/>june 4th sat ' . getSaturdayDay(2013, 6, 3); 
+0

câu trả lời đáng tin cậy nhất cho đến nay – user3338098

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