Überprüfen, ob das Datum Wochenende PHP ist

88

Diese Funktion scheint nur false zurückzugeben. Bekommt einer von euch das Gleiche? Ich bin mir sicher, dass ich etwas übersehen habe, aber frische Augen und all das ...

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

Ich rufe die Funktion folgendermaßen auf:

$isthisaweekend = isweekend('2011-01-01');
JamieSellars
quelle
15
Ihr trueund falsesollte nicht als Zeichenfolge zitiert werden. Außerdem sollte Ihr Code einen Analysefehler enthalten und aufgrund der Streuung }in Ihrem if überhaupt nicht ausgeführt werden.
BoltClock

Antworten:

208

Wenn Sie PHP> = 5.1 haben:

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

Andernfalls:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}
DiebMaster
quelle
10
Wenn Sie PHP <5 verwenden, return date('w', strtotime($date)) % 6 == 0ist die Verwendung etwas kürzer.
Jim
23
Während dies dasselbe tut, würde ich sagen, dass die explizite Überprüfung für jemanden, der den Code liest, offensichtlicher ist.
ThiefMaster
2
Dafür sind Kommentare gedacht.
Stephen Sabatini
13
Nun, es gibt Leute, die sagen, dass Code ohne viele Kommentare lesbar sein sollte. Guter Code ist lesbar - und nicht unbedingt kurz. #CleanCode
anweibel
Je weniger Code vorhanden ist, desto weniger muss getestet und gewartet werden. Aber wenn es nicht lesbar ist, ist es schwieriger zu testen und zu warten. Muss es eine feste Regel für die Lesbarkeit geben, oder liegt es an der Erfahrung?
Liegen
48

Eine andere Möglichkeit ist die Verwendung der DateTime- Klasse. Auf diese Weise können Sie auch die Zeitzone angeben. Hinweis: PHP 5.3 oder höher.

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

Wenn Sie eine bestimmte Datumszeichenfolge überprüfen müssen, können Sie DateTime :: createFromFormat verwenden

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

Das Schöne an dieser Art ist, dass Sie die Zeitzone angeben können, ohne die Zeitzone in PHP global zu ändern, was in anderen Skripten (z. B. Wordpress) zu Nebenwirkungen führen kann.

Brian
quelle
1
Nehmen Sie Ihre Gegenstimme, aber der Pedant in mir warnt Sie, wenn sie beschließen, einen zusätzlichen Tag der Woche hinzuzufügen, es könnte nur ein Wochentag sein :)
Tricky
"Auf diese Weise können Sie auch die Zeitzone angeben". Gemäß diesem SO-Beitrag können Sie die Zeitzone auch auf alternative Weise angeben. Ich habe Ihre Lösung verwendet
Wouter Vanherck
11

Wenn Sie PHP 5.5 oder PHP 7 oben verwenden, möchten Sie möglicherweise Folgendes verwenden:

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

und es wird "wahr" zurückgeben, wenn heute Wochenende ist und "falsch", wenn nicht.

Harvey
quelle
Dies funktioniert nur für englischsprachige Websites. Es könnte geändert werden, würde aber für Websites mit mehreren Sprachen umständlich werden.
Bob Ray
1
@ Bob Ray oh okay, sorry, das habe ich nicht bemerkt, als ich es geschrieben habe
Harvey
9

Hier:

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

Die Arbeitsversion Ihres Codes (aus den von BoltClock aufgezeigten Fehlern):

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

?>

Das streunende "{" ist schwer zu erkennen, insbesondere ohne einen anständigen PHP-Editor (in meinem Fall). Also poste ich die korrigierte Version hier.

Hoàng Long
quelle
Sie sollten auch nicht zitiert wahr oder falsch zurückgeben - oder noch besser, geben Sie einfach die Bedingung zurück.
Alex
@alex: Ich benutze "Echo", um das Ergebnis zu bestätigen, also ... das war's. Danke für den Hinweis.
Hoàng Long
2

Für Leute wie mich, die nicht minimalistisch sind, gibt es eine PECL-Erweiterung namens " intl ". Ich benutze es für die IDN-Konvertierung, da es viel besser funktioniert als die Erweiterung "IDN" und einige andere n1-Klassen wie "IntlDateFormatter".

Nun, ich möchte sagen, dass die "intl" -Erweiterung eine Klasse namens "IntlCalendar" hat, die viele internationale Länder verarbeiten kann (z. B. in Saudi-Arabien ist Sonntag kein Wochenendtag). Der IntlCalendar hat eine Methode IntlCalendar :: isWeekend . Vielleicht probiert ihr es aus, ich mag die Tatsache, dass "es für fast jedes Land funktioniert" in diesen internationalen Klassen.

EDIT: Nicht ganz sicher, aber seit PHP 5.5.0 ist die intl-Erweiterung mit PHP (--enable-intl) gebündelt.

boesing
quelle
0

Das funktioniert bei mir und ist wiederverwendbar.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Wynn
quelle