Checking if date is weekend PHP

PhpDate

Php Problem Overview


This function seems to only return false. Are any of you getting the same? I'm sure I'm overlooking something, however, fresh eyes and all that ...

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

I call the function using the following:

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

Php Solutions


Solution 1 - Php

If you have PHP >= 5.1:

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

otherwise:

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

Solution 2 - Php

Another way is to use the DateTime class, this way you can also specify the timezone. Note: PHP 5.3 or higher.

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

If you need to be able to check a certain date string, you can use DateTime::createFromFormat

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

The beauty of this way is that you can specify the timezone without changing the timezone globally in PHP, which might cause side-effects in other scripts (for ex. Wordpress).

Solution 3 - Php

If you're using PHP 5.5 or PHP 7 above, you may want to use:

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

and it will return "true" if today is weekend and "false" if not.

Solution 4 - Php

Here:

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

Solution 5 - Php

The working version of your code (from the errors pointed out by 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";
}

?>

The stray "{" is difficult to see, especially without a decent PHP editor (in my case). So I post the corrected version here.

Solution 6 - Php

For guys like me, who aren't minimalistic, there is a PECL extension called "intl". I use it for idn conversion since it works way better than the "idn" extension and some other n1 classes like "IntlDateFormatter".

Well, what I want to say is, the "intl" extension has a class called "IntlCalendar" which can handle many international countries (e.g. in Saudi Arabia, sunday is not a weekend day). The IntlCalendar has a method IntlCalendar::isWeekend for that. Maybe you guys give it a shot, I like that "it works for almost every country" fact on these intl-classes.

EDIT: Not quite sure but since PHP 5.5.0, the intl extension is bundled with PHP (--enable-intl).

Solution 7 - Php

This works for me and is reusable.

function isThisDayAWeekend($date) {

	$timestamp = strtotime($date);

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

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

}

Solution 8 - Php

As opposed to testing the explicit day of the week string or number, you can also test using the relative date this weekday of the supplied date.

A direct comparison between the values is not possible without a workaround, as the use of weekday resets the time of the supplied date to 00:00:00.0000.

DateTimeInterface objects

$date->setTime(0, 0, 0) != $date->modify('this weekday');

DateTimeInterface Method

A simple method to implement to ensure the supplied date object is not changed.

function isWeekend(DateTimeInterface $date): bool
{
    if ($date instanceof DateTime) {
        $date = DateTimeImmutable::createFromMutable($date);
    }

    return $date->setTime(0,0,0) != $date->modify('this weekday');
}

isWeekend(new DateTimeImmutable('Sunday')); //true

strtotime method

With strtotime you can compare with the date('Yz') format. If the Yz value changes between the supplied date and this weekday, the supplied date is not a weekday.

function isWeekend(string $date): bool
{
    return date('Yz', strtotime($dateValue)) != date('Yz', strtotime($dateValue . ' this weekday'));
}

isWeekend('Sunday'); //true

Example

https://3v4l.org/TSAVi

$sunday = new DateTimeImmutable('Sunday');
foreach (new DatePeriod($sunday, new DateInterval('P1D'), 6) as $date) {
    echo $date->format('D') . ' is' . (isWeekend($date) ? '' : ' not') . ' a weekend';
}

Result

Sun is a weekend
Mon is not a weekend
Tue is not a weekend
Wed is not a weekend
Thu is not a weekend
Fri is not a weekend
Sat is a weekend

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJS1986View Question on Stackoverflow
Solution 1 - PhpThiefMasterView Answer on Stackoverflow
Solution 2 - PhpBrianView Answer on Stackoverflow
Solution 3 - PhpharveyhansView Answer on Stackoverflow
Solution 4 - Phpreko_tView Answer on Stackoverflow
Solution 5 - PhpHoàng LongView Answer on Stackoverflow
Solution 6 - PhpboesingView Answer on Stackoverflow
Solution 7 - PhpWynnView Answer on Stackoverflow
Solution 8 - PhpWill B.View Answer on Stackoverflow