Проверка даты выходного дня PHP


89

Эта функция, кажется, возвращает только false. У кого-нибудь из вас то же самое? Я уверен, что что-то не замечаю, однако свежий взгляд и все такое ...

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

Я вызываю функцию следующим образом:

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

15
Ваш trueand falseне следует указывать как строки. Также ваш код должен выдавать ошибку синтаксического анализа и даже не запускаться вообще из-за ошибочного }в вашем if.
BoltClock

Ответы:


215

Если у вас PHP> = 5.1:

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

в противном случае:

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

10
Если вы используете PHP <5, тогда использование return date('w', strtotime($date)) % 6 == 0будет немного короче.
Джим

23
Хотя это делает то же самое, я бы сказал, что явная проверка более очевидна для тех, кто читает код.
ThiefMaster

2
Опять же, для этого и нужны комментарии.
Стивен Сабатини,

13
Ну, есть люди, которые говорят, что код должен быть читабельным без особых комментариев. Хороший код читабелен - и не обязательно короткий. #CleanCode
anweibel

Чем меньше кода, тем меньше нужно тестировать и поддерживать. Но если он нечитаемый, его сложнее тестировать и поддерживать. Должно ли быть жесткое правило относительно удобочитаемости или все зависит от опыта?
полулежа

48

Другой способ - использовать класс DateTime , таким образом вы также можете указать часовой пояс. Примечание: PHP 5.3 или выше.

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

Если вам нужно проверить определенную строку даты, вы можете использовать DateTime :: createFromFormat

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

Прелесть этого способа заключается в том, что вы можете указать часовой пояс, не изменяя его глобально в PHP, что может вызвать побочные эффекты в других скриптах (например, Wordpress).


1
Примите ваш голос, но педант во мне предупреждает вас, когда они решают добавить дополнительный день недели, это может быть просто будний день :)
Tricky

"таким образом вы также можете указать часовой пояс". Согласно этому сообщению SO , вы также можете указать часовой пояс альтернативными способами. Я использовал ваше решение
Воутер Ванхерк

11

Если вы используете PHP 5.5 или PHP 7 выше, вы можете использовать:

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

и он вернет true, если сегодня выходные, и false, если нет.


Это будет работать только для англоязычных сайтов. Его можно изменить, но он станет громоздким для сайтов с несколькими языками.
Боб Рэй

1
@ Боб Рэй, ладно, извини, я не заметил этого, пока писал
Харви,

9

Вот:

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

8

Рабочая версия вашего кода (из ошибок, указанных 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";
}

?>

Случайное "{" трудно увидеть, особенно без приличного редактора PHP (в моем случае). Так что выкладываю исправленную версию сюда.


Вы также не должны возвращать истину или ложь в кавычках или, что еще лучше, просто возвращайте условие.
Alex

@alex: Я использую "эхо", чтобы подтвердить результат, так что .. вот и все. Спасибо за совет.
Hoàng Long

2

Для парней вроде меня, которые не являются минималистами, есть расширение PECL под названием " intl ". Я использую его для преобразования idn, так как он работает лучше, чем расширение idn и некоторые другие классы n1, такие как IntlDateFormatter.

Что ж, я хочу сказать, что расширение "intl" имеет класс под названием "IntlCalendar", который может работать со многими международными странами (например, в Саудовской Аравии воскресенье - не выходной день). Для этого в IntlCalendar есть метод IntlCalendar :: isWeekend . Может быть, вы, ребята, попробуете, мне нравится, что "это работает почти для каждой страны" на этих международных классах.

РЕДАКТИРОВАТЬ: Не совсем уверен, но с PHP 5.5.0 расширение intl связано с PHP (--enable-intl).


0

Это работает для меня и может использоваться повторно.

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

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

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

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.