2011-01-26 16 views
66

Esta función parece que solo devuelve falso. ¿Alguno de ustedes está recibiendo lo mismo? Estoy seguro de que estoy pasando por alto algo, sin embargo, los ojos frescos y todo eso ...Comprobando si la fecha es fines de semana PHP

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

que llamo la función utilizando la siguiente:

$isthisaweekend = isweekend('2011-01-01'); 
+12

Tus 'true' y' false' no se deben citar como cadenas. Además, su código debería dar un error de análisis y ni siquiera ejecutar en absoluto debido a la dispersión '}' en su if. – BoltClock

Respuesta

174

Si tiene PHP> = 5.1:

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

de otro modo:

function isWeekend($date) { 
    $weekDay = date('w', strtotime($date)); 
    return ($weekDay == 0 || $weekDay == 6); 
} 
+6

Si usa PHP <5, entonces usar 'fecha de regreso ('w', strtotime ($ date))% 6 == 0' es un poco más corto. – Jim

+13

Si bien hace lo mismo, yo 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. –

8

aquí:

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

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

?> 

La perdida "{" es difícil de ver, sobre todo, sin un editor de PHP decente (en mi caso). Entonces publico la versión corregida aquí.

+0

Tampoco debería devolver las palabras verdaderas o falsas, o mejor aún, simplemente devuelva la condición. – alex

+0

@alex: uso "echo" para confirmar el resultado, así que ... eso es todo. Gracias por el consejo. –

+10

Sus nombres de variables apestan. – ThiefMaster

-2
<?php 
$strt_date = date_create('2013-11-11'); 
$end_date = date_create('2013-11-18'); 
date_sub($strt_date, date_interval_create_from_date_string('1 day')); 
$interval = date_diff($strt_date, $end_date); 
$num = $interval->format('%a'); 
for ($i = 0; $i < $num; $i++) { 
    date_add($strt_date, date_interval_create_from_date_string('1 day')); 
    $next_day = date_format($strt_date, 'd-m-Y'); 
    echo "<br>"; 

    $new_date = new DateTime($next_day); 
    $weeknum = $new_date->format('w'); 
    if (($weeknum != 0) && ($weeknum != 6)) { 
     echo "not a holiday :$next_day "; 
    } 
} 
?> 
1

Para gente como yo, que no son minimalista, hay una extensión PECL llamado "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 tomen una oportunidad, me gusta ese hecho de "funciona para casi todos los países" en estas clases intl.

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

28

Otra forma es utilizar la clase DateTime, de esta manera 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 tiene que ser capaz de verificar una determinada cadena de fecha, puede utilizar 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 manera es que se puede especificar la zona horaria sin cambiar la zona horaria global en PHP, que podría causar efectos secundarios en otros scripts (por ejemplo, Wordpress).

+0

Tome su voto popular, pero el pedante en mí lo advierte cuando deciden agregar un día adicional de la semana, tal vez solo sea un día de la semana :) – Tricky

4

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

function isTodayWeekend() { 
    return date("l") == "Saturday" or date("l") == "Sunday"; 
} 

y volverá "verdadero" si hoy es fin de semana y "falso" en caso contrario.

Cuestiones relacionadas