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

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

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


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.


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

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


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


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

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.