Перевірка, чи дата вихідного 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
Ваші trueі 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
Візьміть свій голос за, але педант в мені попереджає вас, коли вони вирішать додати додатковий день тижня, це може бути просто будній день :)
Хитро

"таким чином ви також можете вказати часовий пояс". Відповідно до цієї публікації SO , ви можете вказати часовий пояс також іншими способами. Однак я використав ваше рішення
Wouter Vanherck

11

Якщо ви використовуєте PHP 5.5 або PHP 7 вище, ви можете використовувати:

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

і це поверне "true", якщо сьогодні вихідні, і "false", якщо ні.


Це буде працювати лише для англомовних сайтів. Він може бути змінений, але буде громіздким для сайтів з кількома мовами.
Боб Рей

1
@Bob Ray о гаразд вибачте, я не помітив, що, коли я це писав
Харві,

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: Я використовую "ехо" для підтвердження результату, так .. все. Дякую за пораду.
Хоанг Лонг

2

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

Що ж, я хочу сказати, розширення "intl" має клас "IntlCalendar", який може працювати з багатьма міжнародними країнами (наприклад, у Саудівській Аравії неділя не є вихідним днем). Для цього IntlCalendar має метод IntlCalendar :: isWeekend . Можливо, ви, хлопці, спробуєте зробити це, мені подобається, що "це працює майже в усіх країнах" на цих міжнародних класах.

EDIT: Не зовсім впевнений, але з 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.