Verificando se a data é final de semana PHP

89

Esta função parece retornar apenas falso. Algum de vocês está recebendo o mesmo? Tenho certeza que estou esquecendo algo, no entanto, olhos novos e tudo isso ...

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

Eu chamo a função usando o seguinte:

$isthisaweekend = isweekend('2011-01-01');
JamieSellars
fonte
15
Seu truee falsenão deve ser citado como strings. Além disso, seu código deve dar um erro de análise e nem mesmo ser executado por causa do erro }em seu if.
BoltClock

Respostas:

210

Se você tiver PHP> = 5.1:

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

de outra forma:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}
ThiefMaster
fonte
10
Se você usa PHP <5, o uso return date('w', strtotime($date)) % 6 == 0é um pouco mais curto.
Jim
23
Embora isso faça a mesma coisa, eu diria que a verificação explícita é mais óbvia para quem está lendo o código.
ThiefMaster
2
Então, novamente, é para isso que servem os comentários.
Stephen Sabatini
13
Bem, há pessoas que dizem que o código deve ser legível sem muitos comentários. Um bom código é legível - e não necessariamente curto. #CleanCode
anweibel de
Quanto menos código houver, menos há para testar e manter. Mas se for ilegível, é mais difícil de testar e manter. Tem que haver uma regra rígida e rápida sobre legibilidade ou é devido à experiência?
reclinado em
48

Outra forma é usar a classe DateTime , dessa forma você também pode especificar o fuso horário. Nota: PHP 5.3 ou superior.

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

Se você precisa ser capaz de verificar uma determinada string de data, você pode usar DateTime :: createFromFormat

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

A beleza dessa forma é que você pode especificar o fuso horário sem alterá-lo globalmente no PHP, o que pode causar efeitos colaterais em outros scripts (por exemplo, Wordpress).

Brian
fonte
1
Faça seu voto positivo, mas o pedante em mim está avisando quando eles decidem adicionar um dia extra da semana, pode ser apenas um dia de semana :)
Tricky
"desta forma, você também pode especificar o fuso horário". De acordo com este post do SO , você também pode especificar o fuso horário de maneiras alternativas. No entanto, usei sua solução
Wouter Vanherck
11

Se você estiver usando PHP 5.5 ou PHP 7 acima, convém usar:

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

e retornará "verdadeiro" se hoje for fim de semana e "falso" se não for.

Harvey
fonte
Isso só funcionará para sites em inglês. Ele poderia ser modificado, mas seria complicado para sites com vários idiomas.
Bob Ray
1
@Bob Ray, tudo bem, desculpe, não percebi enquanto escrevia
Harvey
9

Aqui:

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

A versão de trabalho do seu código (a partir dos erros apontados por 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";
}

?>

O extraviado "{" é difícil de ver, especialmente sem um editor de PHP decente (no meu caso). Então eu posto a versão corrigida aqui.

Hoàng Long
fonte
Você também não deve retornar verdadeiro ou falso entre aspas - ou melhor ainda, apenas retornar a condição.
alex
@alex: Eu uso "echo" para confirmar o resultado, então ... é isso. Obrigado pelo conselho.
Hoàng Long
2

Para caras como eu, que não são minimalistas, existe uma extensão PECL chamada " intl ". Eu o uso para conversão de idn, pois funciona muito melhor do que a extensão "idn" e algumas outras classes n1 como "IntlDateFormatter".

Bem, o que eu quero dizer é que a extensão "intl" tem uma classe chamada "IntlCalendar" que pode lidar com muitos países internacionais (por exemplo, na Arábia Saudita, domingo não é um dia de fim de semana). O IntlCalendar possui um método IntlCalendar :: isWeekend para isso. Talvez vocês tentem, gosto do fato de "funciona para quase todos os países" nessas classes internacionais.

EDITAR: Não tenho certeza, mas desde o PHP 5.5.0, a extensão intl vem junto com o PHP (--enable-intl).

Boesing
fonte
0

Isso funciona para mim e é reutilizável.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Wynn
fonte