Vérifier si la date est le week-end PHP

89

Cette fonction semble ne renvoyer que faux. Est-ce que l'un d'entre vous a la même chose? Je suis sûr que j'oublie quelque chose, cependant, des yeux nouveaux et tout ça ...

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

J'appelle la fonction en utilisant ce qui suit:

$isthisaweekend = isweekend('2011-01-01');
JamieVendeurs
la source
15
Votre trueet falsene doit pas être cité comme des chaînes. De plus, votre code devrait donner une erreur d'analyse et ne même pas s'exécuter du tout à cause de l'erreur }dans votre if.
BoltClock

Réponses:

210

Si vous avez PHP> = 5.1:

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

autrement:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}
ThiefMaster
la source
10
Si vous utilisez PHP <5, l'utilisation return date('w', strtotime($date)) % 6 == 0est un peu plus courte.
Jim
23
Bien que cela fasse la même chose, je dirais que la vérification explicite est plus évidente pour quelqu'un qui lit le code.
ThiefMaster
2
Là encore, c'est à cela que servent les commentaires.
Stephen Sabatini
13
Eh bien, il y a des gens qui disent que le code devrait être lisible sans beaucoup de commentaires. Un bon code est lisible - et pas nécessairement court. #CleanCode
anweibel
Moins il y a de code, moins il y a de test et de maintenance. Mais si c'est illisible, c'est plus difficile à tester et à maintenir. Doit-il y avoir une règle absolue sur la lisibilité, ou est-ce une question d'expérience?
inclinable le
48

Une autre façon consiste à utiliser la classe DateTime , de cette façon vous pouvez également spécifier le fuseau horaire. Remarque: PHP 5.3 ou supérieur.

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

Si vous avez besoin de pouvoir vérifier une certaine chaîne de date, vous pouvez utiliser DateTime :: createFromFormat

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

La beauté de cette façon est que vous pouvez spécifier le fuseau horaire sans changer le fuseau horaire globalement en PHP, ce qui pourrait provoquer des effets secondaires dans d'autres scripts (par exemple, Wordpress).

Brian
la source
1
Prenez votre vote favorable, mais le pédant en moi vous avertit quand ils décident d'ajouter un jour supplémentaire de la semaine, cela pourrait être juste un jour de semaine :)
Tricky
"de cette façon, vous pouvez également spécifier le fuseau horaire". Selon cet article SO , vous pouvez également spécifier le fuseau horaire de différentes manières. J'ai utilisé votre solution cependant
Wouter Vanherck
11

Si vous utilisez PHP 5.5 ou PHP 7 ci-dessus, vous souhaiterez peut-être utiliser:

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

et il retournera "vrai" si aujourd'hui est le week-end et "faux" sinon.

Harvey
la source
Cela ne fonctionnera que pour les sites en anglais. Il pourrait être modifié, mais deviendrait lourd pour les sites avec plusieurs langues.
Bob Ray le
1
@Bob Ray oh ok désolé je ne l'ai pas remarqué pendant que je l'écrivais
Harvey le
9

Ici:

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

La version de travail de votre code (à partir des erreurs signalées par 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";
}

?>

Le "{" errant est difficile à voir, surtout sans un éditeur PHP décent (dans mon cas). Je poste donc la version corrigée ici.

Hoàng Long
la source
Vous ne devez pas non plus renvoyer la valeur true ou false - ou mieux encore, renvoyer simplement la condition.
alex le
@alex: J'utilise "echo" pour confirmer le résultat, donc ... c'est tout. Merci pour le conseil.
Hoàng Long le
2

Pour les gars comme moi, qui ne sont pas minimalistes, il existe une extension PECL appelée " intl ". Je l'utilise pour la conversion idn car il fonctionne bien mieux que l'extension "idn" et quelques autres classes n1 comme "IntlDateFormatter".

Eh bien, ce que je veux dire, c'est que l'extension "intl" a une classe appelée "IntlCalendar" qui peut gérer de nombreux pays internationaux (par exemple en Arabie Saoudite, le dimanche n'est pas un jour de week-end). IntlCalendar a une méthode IntlCalendar :: isWeekend pour cela. Peut-être que vous essayez, j'aime le fait que "ça marche pour presque tous les pays" sur ces classes internationales.

EDIT: Pas tout à fait sûr mais depuis PHP 5.5.0, l'extension intl est fournie avec PHP (--enable-intl).

boesing
la source
0

Cela fonctionne pour moi et est réutilisable.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Wynn
la source