ตรวจสอบว่าวันที่เป็น PHP วันหยุดสุดสัปดาห์หรือไม่


90

ดูเหมือนว่าฟังก์ชันนี้จะส่งคืนเท็จเท่านั้น มีใครเป็นเหมือนกันบ้างไหม? ฉันแน่ใจว่ากำลังมองเห็นบางสิ่งบางอย่างอย่างไรก็ตามดวงตาที่สดใสและทั้งหมดนั้น ...

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";
    }
}

ฉันเรียกใช้ฟังก์ชันโดยใช้สิ่งต่อไปนี้:

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

15
ของคุณtrueและfalseไม่ควรยกมาเป็นสตริง นอกจากนี้รหัสของคุณควรให้ข้อผิดพลาดในการแยกวิเคราะห์และไม่ทำงานเลยด้วยซ้ำเนื่องจากการหลงทาง}ใน if ของคุณ
BoltClock

คำตอบ:


221

หากคุณมี PHP> = 5.1:

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

มิฉะนั้น:

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

11
หากคุณใช้ PHP <5 การใช้งานreturn date('w', strtotime($date)) % 6 == 0จะสั้นลงเล็กน้อย
จิม

23
แม้ว่าจะทำเช่นเดียวกัน แต่ฉันก็บอกว่าการตรวจสอบอย่างชัดเจนนั้นชัดเจนมากขึ้นสำหรับคนที่อ่านรหัส
ThiefMaster

2
แล้วอีกครั้งนั่นคือความคิดเห็นสำหรับ
Stephen Sabatini

13
มีคนบอกว่าโค้ดควรอ่านได้โดยไม่ต้องแสดงความคิดเห็นมากนัก รหัสที่ดีสามารถอ่านได้ - และไม่จำเป็นต้องสั้นเสมอไป #CleanCode
anweibel

ยิ่งมีโค้ดน้อยก็ยิ่งมีการทดสอบและบำรุงรักษาน้อย แต่ถ้าอ่านไม่ได้ก็ยากที่จะทดสอบและดูแลรักษา ต้องมีกฎที่ยากและรวดเร็วเกี่ยวกับความสามารถในการอ่านหรือไม่ก็เป็นเรื่องยาก
ปรับเอนนอน

49

อีกวิธีหนึ่งคือการใช้คลาสDateTimeซึ่งคุณสามารถระบุเขตเวลาได้ด้วย หมายเหตุ: PHP 5.3 หรือสูงกว่า

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

หากคุณต้องการตรวจสอบสตริงวันที่ที่แน่นอนคุณสามารถใช้DateTime :: createFromFormat

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

ความสวยงามของวิธีนี้คือคุณสามารถระบุเขตเวลาโดยไม่ต้องเปลี่ยนเขตเวลาทั่วโลกใน PHP ซึ่งอาจทำให้เกิดผลข้างเคียงในสคริปต์อื่น ๆ (เช่น Wordpress)


1
เพิ่มคะแนนของคุณ แต่คนอวดรู้ในตัวฉันกำลังเตือนคุณเมื่อพวกเขาตัดสินใจเพิ่มวันพิเศษในสัปดาห์อาจเป็นวันธรรมดาก็ได้ :)
Tricky

"ด้วยวิธีนี้คุณสามารถระบุเขตเวลาได้" ตามโพสต์ SO นี้คุณสามารถระบุเขตเวลาด้วยวิธีอื่นได้เช่นกัน ฉันใช้วิธีแก้ปัญหาของคุณแล้ว
Wouter Vanherck

12

หากคุณใช้ PHP 5.5 หรือ PHP 7 ข้างต้นคุณอาจต้องการใช้:

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

และจะกลับมาเป็น "จริง" หากวันนี้เป็นวันหยุดสุดสัปดาห์และ "เท็จ" ถ้าไม่


สิ่งนี้จะใช้ได้กับไซต์ภาษาอังกฤษเท่านั้น สามารถแก้ไขได้ แต่จะยุ่งยากสำหรับไซต์ที่มีหลายภาษา
Bob Ray

1
@ Bob Ray โอ้โอเคขอโทษที่ฉันไม่ได้สังเกตว่าในขณะที่ฉันเขียน
Harvey

9

ที่นี่:

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

8

เวอร์ชันที่ใช้งานได้ของรหัสของคุณ (จากข้อผิดพลาดที่ BoltClock ชี้ให้เห็น):

<?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";
}

?>

"{" หลงทางนั้นมองเห็นได้ยากโดยเฉพาะหากไม่มีตัวแก้ไข PHP ที่ดี (ในกรณีของฉัน) ดังนั้นฉันจึงโพสต์เวอร์ชันที่แก้ไขแล้วที่นี่


คุณไม่ควรคืนค่าที่ยกมาเป็นจริงหรือเท็จ - หรือดีกว่าเพียงแค่คืนเงื่อนไข
alex

@alex: ฉันใช้ "echo" เพื่อยืนยันผลลัพธ์ดังนั้น .. ขอบคุณสำหรับคำแนะนำ.
Hoàng Long

2

สำหรับผู้ชายอย่างฉันที่ไม่เรียบง่ายมีนามสกุล PECL ที่เรียกว่า " intl " ฉันใช้มันสำหรับการแปลง idn เนื่องจากมันทำงานได้ดีกว่าส่วนขยาย "idn" และคลาส n1 อื่น ๆ เช่น "IntlDateFormatter"

สิ่งที่ฉันอยากจะบอกคือส่วนขยาย "intl" มีคลาสที่เรียกว่า "IntlCalendar" ซึ่งสามารถจัดการกับประเทศต่าง ๆ ได้หลายประเทศ (เช่นในซาอุดิอาระเบียวันอาทิตย์ไม่ใช่วันหยุดสุดสัปดาห์) IntlCalendar มีวิธีการIntlCalendar :: isWeekendสำหรับสิ่งนั้น บางทีพวกคุณอาจจะลองดูสักครั้งฉันชอบที่ "มันใช้ได้กับเกือบทุกประเทศ" ในชั้นเรียนนานาชาติเหล่านี้

แก้ไข: ไม่ค่อยแน่ใจนัก แต่เนื่องจาก PHP 5.5.0 ส่วนขยาย intl จะมาพร้อมกับ PHP (--enable-intl)


0

สิ่งนี้ใช้ได้กับฉันและสามารถใช้ซ้ำได้

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.