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');

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

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).


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.


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

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.


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).


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

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.