Tarihin hafta sonu olup olmadığı kontrol ediliyor PHP


90

Bu işlev yalnızca yanlış döndürüyor gibi görünüyor. Herhangi biriniz aynı şeyi alıyor mu? Eminim bir şeyi gözden kaçırıyorumdur, ancak, taze gözler ve tüm bunlar ...

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

Fonksiyonu aşağıdakileri kullanarak çağırıyorum:

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

15
Sizin trueve falsedizeler olarak alıntılanmamalıdır. Ayrıca, kodunuz bir ayrıştırma hatası vermeli ve if'nizdeki başıboş olduğundan hiç çalışmamalıdır }.
BoltClock

Yanıtlar:


221

PHP> = 5.1'iniz varsa:

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

aksi takdirde:

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

11
PHP <5 kullanıyorsanız return date('w', strtotime($date)) % 6 == 0, kullanmak biraz daha kısadır.
Jim

23
Bu aynı şeyi yapsa da, kodu okuyan biri için açık kontrolün daha açık olduğunu söyleyebilirim.
ThiefMaster

2
Sonra yine yorumlar bunun içindir.
Stephen Sabatini

13
Pek çok yorum yapılmadan kodun okunabilir olması gerektiğini söyleyenler var. İyi kod okunabilir - ve mutlaka kısa olması gerekmez. #CleanCode
anweibel

Ne kadar az kod varsa, test etmek ve bakımını yapmak o kadar az olacaktır. Ancak okunamıyorsa, test etmesi ve bakımı daha zordur. Okunabilirlik konusunda sert ve hızlı bir kural mı olmalı yoksa deneyim mi?
yatan

49

Başka bir yol da DateTime sınıfını kullanmaktır , bu şekilde saat dilimini de belirtebilirsiniz. Not: PHP 5.3 veya üstü.

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

Belirli bir tarih dizesini kontrol edebilmeniz gerekiyorsa, DateTime :: createFromFormat komutunu kullanabilirsiniz.

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

Bu yolun güzelliği, PHP'de küresel olarak saat dilimini değiştirmeden saat dilimini belirtebilmenizdir; bu, diğer komut dosyalarında (örneğin, Wordpress) yan etkilere neden olabilir.


1
Olumlu oyunuzu alın, ancak içimdeki bilgiç, haftanın fazladan bir gününü eklemeye karar verdiklerinde sizi uyarıyor, sadece hafta içi olabilir :)
Tricky

"bu şekilde saat dilimini de belirtebilirsiniz". Bu SO gönderisine göre , saat dilimini farklı şekillerde de belirtebilirsiniz. Yine de çözümünüzü kullandım
Wouter Vanherck

12

Yukarıdaki PHP 5.5 veya PHP 7 kullanıyorsanız, aşağıdakileri kullanmak isteyebilirsiniz:

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

ve bugün hafta sonu ise "true", değilse "false" olarak dönecektir.


Bu sadece İngilizce sitelerde çalışacaktır. Değiştirilebilir, ancak birden çok dili olan siteler için külfetli olabilir.
Bob Ray

1
@ Bob Ray oh pardon bunu yazarken bunu fark etmedim
Harvey

9

Buraya:

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

8

Kodunuzun çalışan sürümü (BoltClock tarafından belirtilen hatalardan):

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

?>

Başıboş "{", özellikle iyi bir PHP editörü olmadan (benim durumumda) görmek zordur. Bu yüzden düzeltilmiş versiyonu buraya gönderiyorum.


Ayrıca doğru veya yanlış olarak alıntı yapmamalısınız - veya daha iyisi, sadece koşulu geri vermelisiniz.
alex

@alex: Sonucu doğrulamak için "echo" kullanıyorum, yani .. işte bu. Tavsiye için teşekkürler.
Hoàng Long

2

Minimalist olmayan benim gibi adamlar için " intl " adında bir PECL uzantısı var . "İdn" uzantısından ve "IntlDateFormatter" gibi diğer bazı n1 sınıflarından çok daha iyi çalıştığı için onu idn dönüşümü için kullanıyorum.

Pekala, söylemek istediğim, "intl" uzantısının "IntlCalendar" adında bir sınıfı var ve birçok uluslararası ülkeyi idare edebiliyor (örneğin Suudi Arabistan'da, pazar hafta sonu günü değil). IntlCalendar, bunun için IntlCalendar :: isWeekend yöntemine sahiptir. Belki bir şans vermişsinizdir, bu uluslararası sınıflarda "neredeyse her ülke için işe yarar" gerçeğini seviyorum.

DÜZENLEME: Tam emin değilim, ancak PHP 5.5.0'dan beri, intl uzantısı PHP (--enable-intl) ile paketlenmiştir.


0

Bu benim için çalışıyor ve tekrar kullanılabilir.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.