检查日期是否是周末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
您的truefalse不应该被引用为字符串。另外,由于}if中的错误,您的代码也应该给出解析错误,甚至根本不会运行。
BoltClock

Answers:


210

如果您的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的时间要短一些。
Jim

23
虽然这样做是一样的,但我想说,对于阅读代码的人来说,显式检查更为明显。
ThiefMaster 2012年

2
再一次,这就是评论的意思。
斯蒂芬·萨巴蒂尼

13
好吧,有些人说代码应该是可读的,没有很多注释。好的代码是可读的-不一定简短。#CleanCode
anweibel '16

代码越少,测试和维护的代码就越少。但是,如果它不可读,则更难测试和维护。关于可读性是否必须有一个严格的规定,还是需要经验?
倾斜

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 post,您也可以以其他方式指定时区。不过,我已经使用了您的解决方案
Wouter Vanherck

11

如果您使用的是PHP 5.5或以上的PHP 7,则可能要使用:

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

如果今天是周末,则返回“ true”,否则返回“ false”。


这仅适用于英语网站。可以对其进行修改,但是对于使用多种语言的网站来说会很麻烦。
Bob Ray

1
@Bob Ray哦,好的,抱歉,我写这篇文章时没有注意到
Harvey

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:我使用“ echo”确认结果,就是这样。谢谢你的建议。
晃龙

2

对于像我这样的人,他们不是极简主义者,有一个PECL扩展名为“ intl ”。我将其用于idn转换,因为它的工作方式比“ idn”扩展名和诸如“ IntlDateFormatter”之类的其他n1类要好得多。

好吧,我想说的是,“ 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; }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.