Verifica se la data è il fine settimana PHP


90

Questa funzione sembra restituire solo false. Qualcuno di voi sta ricevendo lo stesso? Sono sicuro che sto trascurando qualcosa, tuttavia, occhi nuovi e tutto il resto ...

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 usando quanto segue:

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

15
Il tuo truee falsenon dovrebbe essere citato come stringhe. Inoltre il tuo codice dovrebbe dare un errore di analisi e non funzionare nemmeno a causa del randagio }nel tuo if.
BoltClock

Risposte:


221

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

11
Se usi PHP <5, l'uso return date('w', strtotime($date)) % 6 == 0è un po 'più breve.
Jim

23
Anche se questo fa la stessa cosa, direi che il controllo esplicito è più ovvio per qualcuno che legge il codice.
ThiefMaster

2
Poi di nuovo è a questo che servono i commenti.
Stephen Sabatini

13
Bene, ci sono persone che dicono che il codice dovrebbe essere leggibile senza molti commenti. Un buon codice è leggibile e non necessariamente breve. #CleanCode
anweibel

Meno codice c'è, meno c'è da testare e mantenere. Ma se è illeggibile è più difficile da testare e mantenere. Deve esserci una regola rigida e veloce sulla leggibilità o dipende dall'esperienza?
reclinabile

49

Un altro modo è usare la classe DateTime , in questo modo puoi anche specificare il fuso orario. Nota: PHP 5.3 o superiore.

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

Se devi essere in grado di controllare una certa stringa di data, puoi usare 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 puoi specificare il fuso orario senza cambiare il fuso orario a livello globale in PHP, il che potrebbe causare effetti collaterali in altri script (ad es. Wordpress).


1
Accetta il tuo voto positivo, ma il pedante in me ti avverte quando decidono di aggiungere un giorno in più della settimana potrebbe essere solo un giorno feriale :)
Tricky

"in questo modo puoi anche specificare il fuso orario". Secondo questo post SO , puoi anche specificare il fuso orario in modi alternativi. Tuttavia, ho usato la tua soluzione
Wouter Vanherck

12

Se stai usando PHP 5.5 o PHP 7 sopra, potresti voler usare:

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

e restituirà "vero" se oggi è il fine settimana e "falso" in caso contrario.


Funzionerà solo per i siti in lingua inglese. Potrebbe essere modificato, ma diventerebbe complicato per i siti con più lingue.
Bob Ray

1
@ Bob Ray oh ok scusa non me ne sono accorto mentre lo scrivevo
Harvey

9

Qui:

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

8

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

?>

La "{" vagante è difficile da vedere, soprattutto senza un editor PHP decente (nel mio caso). Quindi inserisco la versione corretta qui.


Inoltre, non dovresti restituire citato vero o falso o, meglio ancora, restituire solo la condizione.
alex

@alex: uso "echo" per confermare il risultato, quindi .. questo è tutto. Grazie per il consiglio.
Hoàng Long,

2

Per ragazzi come me, che non sono minimalisti, c'è un'estensione PECL chiamata " intl ". Lo uso per la conversione idn poiché funziona molto meglio dell'estensione "idn" e di 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 questo. Forse voi ragazzi ci provate, mi piace il fatto che "funziona per quasi tutti i paesi" in queste classi internazionali.

EDIT: Non del tutto sicuro, ma a partire da PHP 5.5.0, l'estensione intl è in bundle con PHP (--enable-intl).


0

Questo funziona per me ed è riutilizzabile.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.