2011-06-25 40 views
5

Tôi không chắc chắn cách thực hiện điều này. Tôi đang xây dựng lịch bằng PHP và cần người dùng có thể thêm sự kiện lặp lại tuân theo quy tắc sau:cách tìm thứ hai cuối cùng của tháng

[DOW] cuối cùng của tháng (vì vậy Cuối cùng [Thứ Hai/Thứ Tư/Thứ Tư, vv] của tuần)

Tôi đã tự lưu trữ quy tắc, tôi không chắc cách tốt nhất để ngoại suy Mon/Tue/Wed cuối cùng của tháng trong PHP? Tôi rơi như tôi đang làm điều này phức tạp hơn nó cần phải được.

Giả sử bạn có các biến cho $month=4, $dow=3$year=2011 cách tốt nhất tôi nên làm điều này?

Trả lời

20

Đối với mọi thứ có liên quan đến ngày mà bạn có thể thể hiện bằng tiếng Anh thích hợp nhưng khó có thể biểu diễn bằng số, strtotime là người bạn tốt nhất của bạn.

echo strtotime("last Monday of June 2011"); 

này trả về một dấu thời gian mà bạn có thể sử dụng như là tham số thứ hai để date và thích để có được một, ngày con người có thể đọc được chính xác. Vì nó là một hàm dựng sẵn được viết bằng C, giải pháp này cũng nhanh hơn hầu hết mọi thứ bạn có thể viết bằng PHP (mặc dù tôi khá chắc chắn nó sẽ không quan trọng nhiều trong một kịch bản thế giới thực).

Vì vậy, giả sử bạn có $month=4, $dow=3$year=2011, bạn sẽ cần một bản đồ mảng $month giá trị cho cơ quan đại diện văn bản tiếng Anh của họ và một bản đồ mảng $dow giá trị cho cơ quan đại diện văn bản của họ.

+2

Cũng giống như một lưu ý: đảm bảo bạn đừng quên 'của'. – cwallenpoole

+0

cảm ơn bạn rất nhiều! Tôi nghĩ rằng tôi đã quá phức tạp nó !! – TH1981

0

Tôi có chức năng chung để bạn tính ngày thứ n của tháng. Hy vọng điều này có thể giúp bạn giải quyết vấn đề của mình.

function get_Nth_dow($dow, $occurence, $m, $y) 
{ 
    $numdays = date('t', mktime(0, 0, 0, $m, 1, $y)); 
    $add = 7 * ($occurence - 1); 
    $firstdow = date('w', mktime(0, 0, 0, $m, 1, $y)); 
    $diff = $firstdow - $dow; 

    $day_of_month = 1; 
    if ($diff > 0) 
    { 
     $day_of_month += ($add - $diff); 
    } 
    elseif ($diff < $numdays) 
    { 
     $day_of_month -= ($diff - $add); 
    } 

    return $day_of_month; 
} 

$DOW = ngày trong tuần (0 = Chủ Nhật, 6 = Thứ Bảy).

$X = lần xuất hiện (1 = đầu tiên, 2 = thứ ba, v.v.). Nếu tháng cụ thể không

không có sự xuất hiện, thì nó sẽ trả về kết quả cuối cùng. Ví dụ: nếu

bạn yêu cầu lần thứ 7 xảy ra vào thứ Sáu, nó sẽ trả lại

thứ Sáu của tháng. $M = tháng $Y = năm

Ví dụ, get_Nth_DOW(2,3,7,2009) sẽ trả lại Thứ Ba thứ ba của 7 năm 2009.

0

Dưới đây là một sự thay thế:

<? 
function lastDayOfMonth($month, $year) { 
    switch ($month) { 
     case 2: 
      # if year is divisible by 4 and not divisible by 100 
      if (($year % 4 == 0) && ($year % 100) > 0) 
       return 29; 
      # or if year is divisible by 400 
      if ($year % 400 == 0) 
       return 29; 
      return 28; 
     case 4: 
     case 6: 
     case 9: 
     case 11: 
      return 30; 
     default: 
      return 31; 
    } 
} 

function lastDayOfWeek($month, $year, $dow) { 
    $d = new DateTime(); 

    #Finding the last day of month 
    $d = $d->setDate($year, $month, lastDayOfMonth($month, $year)); 

    #Getting the day of week of last day of month 
    $date_parts = getdate($d->getTimestamp()); 

    $diff = 0; 

    #if we can't find the $dow in this week... (cause it would lie on next month) 
    if ($dow > $date_parts['wday']) { 
     # ...we go back a week. 
     $diff -= 7; 
    } 

    return $date_parts['mday'] + $diff + ($dow - $date_parts['wday']); 
} 

# checking the algorithm for this month... 
for ($i=0; $i < 7; $i++) { 
    echo lastDayOfWeek(6,2011,$i) . "<br>"; 
} 

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