Перевірка, чи дата вихідного 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.