Verificando si la fecha es PHP de fin de semana

89

Esta función parece devolver solo falso. ¿Alguno de ustedes está recibiendo lo mismo? Estoy seguro de que estoy pasando por alto algo, sin embargo, ojos frescos y todo eso ...

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

Llamo a la función usando lo siguiente:

$isthisaweekend = isweekend('2011-01-01');
JamieSellars
fuente
15
Your truey falseno se deben citar como cadenas. Además, su código debería dar un error de análisis y ni siquiera ejecutarse debido al error }en su if.
BoltClock

Respuestas:

215

Si tiene PHP> = 5.1:

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

de otra manera:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}
ThiefMaster
fuente
10
Si usa PHP <5, entonces el uso return date('w', strtotime($date)) % 6 == 0es un poco más corto.
Jim
23
Si bien eso hace lo mismo, diría que la verificación explícita es más obvia para alguien que lee el código.
ThiefMaster
2
Por otra parte, para eso están los comentarios.
Stephen Sabatini
13
Bueno, hay personas que dicen que el código debería ser legible sin muchos comentarios. Un buen código es legible, y no necesariamente corto. #CleanCode
anweibel
Cuanto menos código hay, menos hay que probar y mantener. Pero si es ilegible, es más difícil de probar y mantener. ¿Tiene que haber una regla estricta y rápida sobre la legibilidad, o se debe a la experiencia?
reclinado el
48

Otra forma es utilizar la clase DateTime , de esta forma también puede especificar la zona horaria. Nota: PHP 5.3 o superior.

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

Si necesita poder verificar una determinada cadena de fecha, puede usar DateTime :: createFromFormat

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

La belleza de esta forma es que puede especificar la zona horaria sin cambiar la zona horaria globalmente en PHP, lo que podría causar efectos secundarios en otros scripts (por ejemplo, Wordpress).

Brian
fuente
1
Tome su upvote, pero el pedante en mí le advierte cuando deciden añadir un día extra de la semana que sólo podría ser un día de semana :)
Tricky
"de esta manera también puede especificar la zona horaria". De acuerdo con esta publicación de SO , también puede especificar la zona horaria de formas alternativas. Sin embargo
Wouter Vanherck
11

Si está utilizando PHP 5.5 o PHP 7 anterior, es posible que desee utilizar:

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

y devolverá "verdadero" si hoy es fin de semana y "falso" si no.

Harvey
fuente
Esto solo funcionará para sitios en inglés. Podría modificarse, pero resultaría engorroso para sitios con varios idiomas.
Bob Ray
1
@Bob Ray oh está bien, lo siento, no me di cuenta de eso mientras lo escribía
Harvey
9

Aquí:

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

La versión de trabajo de su código (de los errores señalados 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";
}

?>

El "{" perdido es difícil de ver, especialmente sin un editor PHP decente (en mi caso). Así que publico la versión corregida aquí.

Hoàng Long
fuente
Tampoco debe devolver entre comillas verdadero o falso, o mejor aún, simplemente devolver la condición.
alex
@alex: uso "echo" para confirmar el resultado, así que ... eso es todo. Gracias por el consejo.
Hoàng Long
2

Para los tipos como yo, que no son minimalistas, existe una extensión PECL llamada " intl ". Lo uso para la conversión de idn ya que funciona mucho mejor que la extensión "idn" y algunas otras clases n1 como "IntlDateFormatter".

Bueno, lo que quiero decir es que la extensión "intl" tiene una clase llamada "IntlCalendar" que puede manejar muchos países internacionales (por ejemplo, en Arabia Saudita, el domingo no es un día de fin de semana). El IntlCalendar tiene un método IntlCalendar :: isWeekend para eso. Tal vez ustedes lo intenten, me gusta el hecho de que "funciona para casi todos los países" en estas clases internacionales.

EDITAR: No estoy seguro, pero desde PHP 5.5.0, la extensión intl se incluye con PHP (--enable-intl).

boesing
fuente
0

Esto funciona para mí y es reutilizable.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Wynn
fuente