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

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

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


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.


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

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.


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


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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.