Sprawdzanie, czy data to weekend PHP

89

Ta funkcja wydaje się zwracać tylko fałsz. Czy ktoś z was ma to samo? Jestem pewien, że coś przeoczę, jednak świeże oczy i to wszystko ...

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

Wywołuję funkcję, używając następującego:

$isthisaweekend = isweekend('2011-01-01');
JamieSellars
źródło
15
Twoje truei falsenie powinny być cytowane jako ciągi. Również twój kod powinien dawać błąd parsowania i nawet nie działać w ogóle z powodu zbłąkanego }if.
BoltClock

Odpowiedzi:

215

Jeśli masz PHP> = 5.1:

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

Inaczej:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}
ThiefMaster
źródło
10
Jeśli używasz PHP <5, użycie return date('w', strtotime($date)) % 6 == 0jest trochę krótsze.
Jim
23
Chociaż powoduje to to samo, powiedziałbym, że jawne sprawdzenie jest bardziej oczywiste dla kogoś czytającego kod.
ThiefMaster
2
Z drugiej strony, po to są komentarze.
Stephen Sabatini
13
Cóż, są ludzie, którzy twierdzą, że kod powinien być czytelny bez wielu komentarzy. Dobry kod jest czytelny - i niekoniecznie krótki. #CleanCode
anweibel
Im mniej kodu, tym mniej jest do przetestowania i utrzymania. Ale jeśli jest nieczytelny, trudniej go przetestować i utrzymać. Czy musi istnieć sztywna i szybka zasada dotycząca czytelności, czy też zależy to od doświadczenia?
rozkładanie
48

Innym sposobem jest użycie klasy DateTime , w ten sposób można również określić strefę czasową. Uwaga: PHP 5.3 lub nowszy.

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

Jeśli potrzebujesz mieć możliwość sprawdzenia określonego ciągu daty, możesz użyć DateTime :: createFromFormat

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

Piękno tego sposobu polega na tym, że możesz określić strefę czasową bez globalnej zmiany strefy czasowej w PHP, co może powodować efekty uboczne w innych skryptach (np. Wordpress).

Brian
źródło
1
Głos za mną, ale pedant we mnie ostrzega cię, kiedy zdecydują się dodać dodatkowy dzień tygodnia, może to być po prostu dzień powszedni :)
Tricky
„w ten sposób możesz również określić strefę czasową”. Zgodnie z tym postem SO , możesz określić strefę czasową również na inne sposoby. Skorzystałem jednak z twojego rozwiązania
Wouter Vanherck
11

Jeśli używasz PHP 5.5 lub PHP 7 powyżej, możesz użyć:

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

i zwróci wartość „prawda”, jeśli dzisiaj jest weekend, i „fałsz”, jeśli nie.

Harvey
źródło
Będzie to działać tylko w przypadku witryn anglojęzycznych. Można go zmodyfikować, ale stałby się uciążliwy dla witryn z wieloma językami.
Bob Ray
1
@Bob Ray oh okej, przepraszam, nie zauważyłem tego podczas pisania
Harvey
9

Tutaj:

function isweekend($year, $month, $day)
{
    $time = mktime(0, 0, 0, $month, $day, $year);
    $weekday = date('w', $time);
    return ($weekday == 0 || $weekday == 6);
}
reko_t
źródło
8

Działająca wersja Twojego kodu (z błędów wskazanych przez 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";
}

?>

Zabłąkany "{" jest trudny do zobaczenia, szczególnie bez porządnego edytora PHP (w moim przypadku). Dlatego zamieszczam tutaj poprawioną wersję.

Hoàng Long
źródło
Nie powinieneś także zwracać w cudzysłowie prawdy lub fałszu - lub jeszcze lepiej, po prostu zwróć warunek.
Alex
@alex: Używam „echo”, aby potwierdzić wynik, więc… to wszystko. Dzięki za radę.
Hoàng Long
2

Dla takich jak ja, którzy nie są minimalistami, istnieje rozszerzenie PECL o nazwie „ intl ”. Używam go do konwersji idn, ponieważ działa znacznie lepiej niż rozszerzenie „idn” i niektóre inne klasy n1, takie jak „IntlDateFormatter”.

Cóż, chcę powiedzieć, że rozszerzenie „intl” ma klasę o nazwie „IntlCalendar”, która może obsługiwać wiele krajów międzynarodowych (np. W Arabii Saudyjskiej niedziela nie jest dniem weekendowym). IntlCalendar ma do tego metodę IntlCalendar :: isWeekend . Może spróbujecie, podoba mi się fakt, że „to działa w prawie każdym kraju” na tych klasach.

EDYCJA: Nie do końca pewne, ale od PHP 5.5.0 rozszerzenie intl jest dołączane do PHP (--enable-intl).

boesing
źródło
0

To działa dla mnie i jest wielokrotnego użytku.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Wynn
źródło