2011-01-26 19 views
66

Questa funzione sembra restituire solo false. Qualcuno di voi sta diventando lo stesso? Sono sicuro che sto affaccia qualcosa, però, gli occhi freschi e tutto il resto ...Verifica se la data è fine settimana 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"; 
    } 
} 

chiamo la funzione utilizzando la seguente:

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

I valori 'true' e' false' non devono essere indicati come stringhe. Anche il tuo codice dovrebbe dare un errore di analisi e nemmeno funzionare affatto a causa del "problema" nel tuo if. – BoltClock

risposta

174

Se si dispone di PHP> = 5.1:

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

altrimenti:

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

Se si utilizza PHP <5 quindi utilizzando 'data di ritorno ('w', strtotime ($ date))% 6 == 0' è un po 'più breve. – Jim

+13

Mentre ciò fa la stessa cosa, direi che il controllo esplicito è più ovvio per chi legge il codice. – ThiefMaster

+2

Quindi, di nuovo, ecco a cosa servono i commenti. –

8

Qui:

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

La versione funzionante del codice (dagli errori sottolineato da 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"; 
} 

?> 

Il randagio "{" è difficile da vedere, soprattutto senza un editor di PHP decente (in il mio caso). Quindi inserisco qui la versione corretta.

+0

Non si dovrebbe inoltre restituire virgolettato vero o falso - o meglio ancora, basta restituire la condizione. – alex

+0

@alex: Io uso "echo" per confermare il risultato, quindi .. questo è tutto. Grazie per il consiglio. –

+10

I nomi delle variabili fanno schifo. – 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

Per ragazzi come me, che non sono minimalisti, esiste un'estensione PECL denominata "intl". Lo uso per la conversione idn poiché funziona molto meglio dell'estensione "idn" e alcune altre classi n1 come "IntlDateFormatter".

Bene, quello che voglio dire è che l'estensione "intl" ha una classe chiamata "IntlCalendar" che può gestire molti paesi internazionali (ad esempio in Arabia Saudita, la domenica non è un giorno di fine settimana). IntlCalendar ha un metodo IntlCalendar::isWeekend per quello. Forse voi ragazzi lo fate, mi piace il fatto che "funzioni per quasi tutti i paesi" su queste classi intl.

MODIFICA: Non sono sicuro che, dal momento che PHP 5.5.0, l'estensione intl è in bundle con PHP (--enable-intl).

28

Un altro modo è utilizzare la classe DateTime, in questo modo è anche possibile specificare il fuso orario. Nota: PHP 5.3 o successivo.

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

Se avete bisogno di essere in grado di controllare una certa stringa di data, è possibile utilizzare DateTime :: createFromFormat

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

La bellezza di questo modo è che è possibile specificare il fuso orario senza modificare il fuso orario globale in PHP, che potrebbe causare effetti collaterali in altri script (ad esempio Wordpress).

+0

Prendi la tua upvote, ma il pedante in me ti avverte quando decidono di aggiungere un giorno extra della settimana potrebbe essere solo un giorno feriale :) – Tricky

4

Se stai usando PHP 5.5 o superiore PHP 7, si consiglia di utilizzare:

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

e tornerà "true" se oggi è fine settimana e "false" in caso contrario.

Problemi correlati