Kiểm tra xem ngày là cuối tuần PHP


89

Hàm này dường như chỉ trả về false. Có ai trong số các bạn nhận được như vậy không? Tuy nhiên, tôi chắc chắn rằng mình đang nhìn ra một thứ gì đó, đôi mắt tươi tắn và tất cả những thứ đó ...

function isweekend($date){
    $date = strtotime($date);
    $date = date("l", $date);
    $date = strtolower($date);
    echo $date;
    if($date == "saturday" || $date == "sunday") {
        return "true";
    } else {
        return "false";
    }
}

Tôi gọi hàm bằng cách sử dụng như sau:

$isthisaweekend = isweekend('2011-01-01');

15
Của bạn truefalsekhông nên được trích dẫn dưới dạng chuỗi. Ngoài ra, mã của bạn sẽ đưa ra lỗi phân tích cú pháp và thậm chí không chạy chút nào do lỗi }trong if của bạn.
BoltClock

Câu trả lời:


215

Nếu bạn có PHP> = 5.1:

function isWeekend($date) {
    return (date('N', strtotime($date)) >= 6);
}

nếu không thì:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}

10
Nếu bạn sử dụng PHP <5 thì việc sử dụng return date('w', strtotime($date)) % 6 == 0sẽ ngắn hơn một chút.
Jim,

23
Trong khi điều đó làm tương tự, tôi muốn nói rằng việc kiểm tra rõ ràng sẽ rõ ràng hơn đối với một người nào đó đang đọc mã.
ThiefMaster

2
Sau đó, một lần nữa đó là những gì bình luận dành cho.
Stephen Sabatini,

13
Chà, có những người nói rằng mã nên đọc được mà không cần nhiều bình luận. Mã tốt có thể đọc được - và không nhất thiết phải ngắn. #CleanCode
anweibel

Càng ít mã thì càng ít phải kiểm tra và bảo trì. Nhưng nếu không đọc được thì nó khó kiểm tra và bảo trì hơn. Có cần phải có một quy tắc cứng và nhanh về khả năng đọc không, hay nó phải trải nghiệm?
ngả người

48

Một cách khác là sử dụng lớp DateTime , bằng cách này bạn cũng có thể chỉ định múi giờ. Lưu ý: PHP 5.3 trở lên.

// For the current date
function isTodayWeekend() {
    $currentDate = new DateTime("now", new DateTimeZone("Europe/Amsterdam"));
    return $currentDate->format('N') >= 6;
}

Nếu bạn cần có thể kiểm tra một chuỗi ngày nhất định, bạn có thể sử dụng DateTime :: createFromFormat

function isWeekend($date) {
    $inputDate = DateTime::createFromFormat("d-m-Y", $date, new DateTimeZone("Europe/Amsterdam"));
    return $inputDate->format('N') >= 6;
}

Cái hay của cách này là bạn có thể chỉ định múi giờ mà không thay đổi múi giờ trên toàn cầu trong PHP, điều này có thể gây ra tác dụng phụ trong các tập lệnh khác (ví dụ: Wordpress).


1
Hãy phiếu bầu tán thành của bạn, nhưng pedant trong tôi được cảnh báo bạn khi họ quyết định bổ sung thêm một ngày trong tuần nó chỉ có thể là một ngày trong tuần :)
Tricky

"theo cách này, bạn cũng có thể chỉ định múi giờ". Theo bài đăng SO này , bạn cũng có thể chỉ định múi giờ theo những cách thay thế. Tôi đã sử dụng giải pháp của bạn mặc dù
Wouter Vanherck

11

Nếu bạn đang sử dụng PHP 5.5 hoặc PHP 7 ở trên, bạn có thể muốn sử dụng:

function isTodayWeekend() {
    return in_array(date("l"), ["Saturday", "Sunday"]);
}

và nó sẽ trả về "true" nếu hôm nay là cuối tuần và "false" nếu không.


Điều này sẽ chỉ hoạt động cho các trang web tiếng Anh. Nó có thể được sửa đổi, nhưng sẽ trở nên cồng kềnh đối với các trang web có nhiều ngôn ngữ.
Bob Ray

1
@Bob Ray, được rồi, xin lỗi tôi đã không nhận thấy điều đó khi tôi viết nó
Harvey

9

Đây:

function isweekend($year, $month, $day)
{
    $time = mktime(0, 0, 0, $month, $day, $year);
    $weekday = date('w', $time);
    return ($weekday == 0 || $weekday == 6);
}

8

Phiên bản làm việc của mã của bạn (từ các lỗi được BoltClock chỉ ra):

<?php
$date = '2011-01-01';
$timestamp = strtotime($date);
$weekday= date("l", $timestamp );
$normalized_weekday = strtolower($weekday);
echo $normalized_weekday ;
if (($normalized_weekday == "saturday") || ($normalized_weekday == "sunday")) {
    echo "true";
} else {
    echo "false";
}

?>

Rất khó nhìn thấy "{" đi lạc, đặc biệt là không có trình soạn thảo PHP phù hợp (trong trường hợp của tôi). Vì vậy, tôi đăng phiên bản sửa chữa ở đây.


Bạn cũng không nên trả về được trích dẫn true hoặc false - hoặc tốt hơn, chỉ cần trả lại điều kiện.
alex

@alex: Tôi sử dụng "echo" để xác nhận kết quả, nên .. vậy thôi. Cảm ơn vì lời khuyên.
Hoàng Long

2

Đối với những người như tôi, những người không theo chủ nghĩa tối giản, có một phần mở rộng PECL được gọi là " intl ". Tôi sử dụng nó để chuyển đổi idn vì nó hoạt động tốt hơn phần mở rộng "idn" và một số lớp n1 khác như "IntlDateFormatter".

Điều tôi muốn nói là, phần mở rộng "intl" có một lớp gọi là "IntlCalendar" có thể xử lý nhiều quốc gia quốc tế (ví dụ: ở Ả Rập Xê Út, chủ nhật không phải là ngày cuối tuần). IntlCalendar có một phương thức IntlCalendar :: isWeekend cho việc đó. Có thể các bạn cho nó một chút, tôi thích rằng thực tế "nó hoạt động cho hầu hết mọi quốc gia" trên các lớp intl này.

CHỈNH SỬA: Không chắc lắm nhưng kể từ PHP 5.5.0, phần mở rộng intl được đóng gói với PHP (--enable-intl).


0

Điều này làm việc cho tôi và có thể tái sử dụng.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

    $weekday= date("l", $timestamp );

    if ($weekday =="Saturday" OR $weekday =="Sunday") { return true; } 
    else {return false; }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.