Memeriksa apakah tanggal adalah akhir pekan PHP

89

Fungsi ini sepertinya hanya mengembalikan false. Apakah ada di antara Anda yang mendapatkan hal yang sama? Saya yakin saya mengabaikan sesuatu, bagaimanapun, mata segar dan semua itu ...

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

Saya memanggil fungsi menggunakan yang berikut:

$isthisaweekend = isweekend('2011-01-01');
JamieSellars
sumber
15
Anda truedan falsetidak boleh dikutip sebagai string. Juga kode Anda harus memberikan kesalahan parse dan bahkan tidak berjalan sama sekali karena menyimpang }di if.
BoltClock

Jawaban:

215

Jika Anda memiliki PHP> = 5.1:

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

jika tidak:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}
ThiefMaster
sumber
10
Jika Anda menggunakan PHP <5 maka penggunaannya return date('w', strtotime($date)) % 6 == 0sedikit lebih singkat.
Jim
23
Sementara itu melakukan hal yang sama, saya akan mengatakan pemeriksaan eksplisit lebih jelas bagi seseorang yang membaca kode.
ThiefMaster
2
Kemudian lagi, untuk itulah komentar.
Stephen Sabatini
13
Nah, ada orang yang bilang kode itu harus bisa dibaca tanpa banyak komentar. Kode yang baik dapat dibaca - dan tidak harus pendek. #CleanCode
anweibel
Semakin sedikit kode, semakin sedikit yang harus diuji dan dipelihara. Tetapi jika tidak terbaca lebih sulit untuk diuji dan dipelihara. Apakah harus ada aturan yang tegas dan cepat tentang keterbacaan, atau apakah itu berdasarkan pengalaman?
berbaring
48

Cara lain adalah dengan menggunakan kelas DateTime , dengan cara ini Anda juga dapat menentukan zona waktu. Catatan: PHP 5.3 atau lebih tinggi.

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

Jika Anda perlu memeriksa string tanggal tertentu, Anda dapat menggunakan DateTime :: createFromFormat

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

Keindahan dari cara ini adalah Anda dapat menentukan zona waktu tanpa mengubah zona waktu secara global di PHP, yang dapat menyebabkan efek samping pada skrip lain (misalnya Wordpress).

Brian
sumber
1
Terima upvote Anda, tetapi pedant dalam diri saya memperingatkan Anda ketika mereka memutuskan untuk menambahkan satu hari ekstra dalam seminggu itu mungkin hanya hari kerja :)
Tricky
"dengan cara ini Anda juga dapat menentukan zona waktu". Menurut posting SO ini , Anda juga dapat menentukan zona waktu dengan cara alternatif. Saya telah menggunakan solusi Anda
Wouter Vanherck
11

Jika Anda menggunakan PHP 5.5 atau PHP 7 di atas, Anda mungkin ingin menggunakan:

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

dan akan mengembalikan "benar" jika hari ini adalah akhir pekan dan "salah" jika tidak.

Harvey
sumber
Ini hanya akan berfungsi untuk situs berbahasa Inggris. Ini dapat dimodifikasi, tetapi akan menjadi rumit untuk situs dengan banyak bahasa.
Bob Ray
1
@Bob Ray oh oke maaf saya tidak menyadarinya ketika saya menulisnya
Harvey
9

Sini:

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

Versi kerja kode Anda (dari kesalahan yang ditunjukkan oleh 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";
}

?>

Kata "{" yang tersesat sulit dilihat, terutama tanpa editor PHP yang layak (dalam kasus saya). Jadi saya memposting versi koreksi di sini.

Hoàng Long
sumber
Anda juga tidak boleh mengembalikan kutipan benar atau salah - atau lebih baik lagi, kembalikan saja kondisinya.
alex
@ alex: Saya menggunakan "echo" untuk mengkonfirmasi hasilnya, jadi .. itu saja. Terima kasih atas sarannya.
Hoàng Long
2

Untuk orang seperti saya, yang tidak minimalis, ada ekstensi PECL yang disebut " intl ". Saya menggunakannya untuk konversi idn karena cara kerjanya jauh lebih baik daripada ekstensi "idn" dan beberapa kelas n1 lainnya seperti "IntlDateFormatter".

Nah, yang ingin saya katakan adalah, ekstensi "intl" memiliki kelas yang disebut "IntlCalendar" yang dapat menangani banyak negara internasional (misalnya di Arab Saudi, hari minggu bukanlah hari akhir pekan). IntlCalendar memiliki metode IntlCalendar :: isWeekend untuk itu. Mungkin kalian mencobanya, saya suka fakta "ini berhasil untuk hampir setiap negara" di kelas intl ini.

EDIT: Tidak begitu yakin tetapi karena PHP 5.5.0, ekstensi intl dibundel dengan PHP (--enable-intl).

boesing
sumber
0

Ini bekerja untuk saya dan dapat digunakan kembali.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Wynn
sumber