leora
leora

Reputation: 196539

How to determine if date is weekend in JavaScript

If I have a date coming into a function, how can I tell if it's a weekend day?

Upvotes: 108

Views: 117621

Answers (12)

Mohsen Alyafei
Mohsen Alyafei

Reputation: 5557

Update Nov 2023

Since mid-2022, the days of the weekend can be obtained using the weekInfo method of Intl.Locale instances.

The method is supported in all modern browsers (under Windows, iOS, and Android including Node.js and Deno, with the exception of Firefox as of Nov 2023).

new Intl.Locale(locale).weekInfo.weekend will return an array of integers indicating the days of the weekend for the particular locale, where 1 is Monday and 7 is Sunday.

Further information can be found on MDN Intl.Locale.prototype.getWeekInfo().

Examples:

console.log(new Intl.Locale("en-US").weekInfo.weekend);
//[6,7]  // weekend is days 6 and 7 (Sat and Sun) in USA

console.log(new Intl.Locale("ar-EG").weekInfo.weekend);
// [5,6]  // weekend is days 5 and 6 (Fri and Sat) in Egypt

console.log(new Intl.Locale("en-IN").weekInfo.weekend);
// [7]  // weekend is day 7 (Sunday) in India

Unlike the Date.getDay() method which returns the weekday number with 0 meaning Sunday, the weekInfo.weekend returns Sunday as day number 7. Monday is day 1.

The function below tests, if the weekday number returned from Date.getDay() (after correction for Sunday) is included in the array of integers returned from the weekInfo.weekend method.

function isWeekend(date , locale="en-US") {
return new Intl.Locale(locale).weekInfo.weekend.includes(date.getUTCDay()||7);
}

//==== test for 2023-11-24 (Friday) =======
let myDate = new Date("2023-11-24");
console.log(isWeekend(myDate));         // false in USA
console.log(isWeekend(myDate,"ar-EG")); // true  in Egypt
console.log(isWeekend(myDate,"en-IN")); // false in India
console.log(isWeekend(myDate,"fa-IR")); // true  in Iran

The following table summarises the days of the workweek and weekends as detailed on table of Wikipedia page.

Total Countries Days of Weekend Total Working Days
95 Saturday and Sunday 5
18 Friday and Saturday 5
1 Friday and Sunday 5
10 Sunday 6
4 Friday 6
1 Saturday 6
Source: Wikipedia (Nov 2023)

Upvotes: 4

LukeH
LukeH

Reputation: 269398

var dayOfWeek = yourDateObject.getDay();
var isWeekend = (dayOfWeek === 6) || (dayOfWeek  === 0); // 6 = Saturday, 0 = Sunday

Upvotes: 220

Tanzeem Bhatti
Tanzeem Bhatti

Reputation: 219

Use .getDay() method on the Date object to get the day.

Check if it is 6 (Saturday) or 0 (Sunday)

var givenDate = new Date('2020-07-11');
var day = givenDate.getDay();
var isWeekend = (day === 6) || (day === 0) ? 'It's weekend': 'It's working day';
    
console.log(isWeekend);

Upvotes: 0

NVRM
NVRM

Reputation: 13082

The following outputs a boolean whether a date object is during «opening» hours, excluding weekend days, and excluding nightly hours between 23H00 and 9H00, while taking into account the client time zone offset.

Of course this does not handle special cases like holidays, but not far to ;)

let t = new Date(Date.now()) // Example Date object
let zoneshift = t.getTimezoneOffset() / 60
let isopen = ([0,6].indexOf(t.getUTCDay()) === -1) && (23 + zoneshift  < t.getUTCHours() === t.getUTCHours() < 9 + zoneshift)

// Are we open?
console.log(isopen)
<b>We are open all days between 9am and 11pm.<br>
Closing the weekend.</b><br><hr>

Are we open now?

Alternatively, to get the day of the week as a locale Human string, we can use:

let t = new Date(Date.now()) // Example Date object

console.log(
  new Intl.DateTimeFormat('en-US', { weekday: 'long'}).format(t) ,
  new Intl.DateTimeFormat('fr-FR', { weekday: 'long'}).format(t) ,
  new Intl.DateTimeFormat('ru-RU', { weekday: 'long'}).format(t)
)

Beware new Intl.DateTimeFormat is slow inside loops, a simple associative array runs way faster:

console.log(
  ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date(Date.now()).getDay()]
)

Upvotes: -1

Damian Tokarczyk
Damian Tokarczyk

Reputation: 526

In the current version, you should use

    var day = yourDateObject.day();
    var isWeekend = (day === 6) || (day === 0);    // 6 = Saturday, 0 = Sunday

Upvotes: 0

Orlandster
Orlandster

Reputation: 4858

Update 2020

There are now multiple ways to achieve this.

1) Using the day method to get the days from 0-6:

const day = yourDateObject.day();
// or const day = yourDateObject.get('day');
const isWeekend = (day === 6 || day === 0);    // 6 = Saturday, 0 = Sunday

2) Using the isoWeekday method to get the days from 1-7:

const day = yourDateObject.isoWeekday();
// or const day = yourDateObject.get('isoWeekday');
const isWeekend = (day === 6 || day === 7);    // 6 = Saturday, 7 = Sunday

Upvotes: 2

felippe
felippe

Reputation: 490

I've tested most of the answers here and there's always some issue with the Timezone, Locale, or when start of the week is either Sunday or Monday.

Below is one which I find is more secure, since it relies on the name of the weekday and on the en locale.

let startDate = start.clone(),
    endDate = end.clone();

let days = 0;
do {
    const weekday = startDate.locale('en').format('dddd'); // Monday ... Sunday
    if (weekday !== 'Sunday' && weekday !== 'Saturday') days++;
} while (startDate.add(1, 'days').diff(endDate) <= 0);

return days;

Upvotes: 1

T04435
T04435

Reputation: 14002

I tried the Correct answer and it worked for certain locales but not for all:

In momentjs Docs: weekday The number returned depends on the locale initialWeekDay, so Monday = 0 | Sunday = 6

So I change the logic to check for the actual DayString('Sunday')

const weekday = momentObject.format('dddd'); // Monday ... Sunday
const isWeekend = weekday === 'Sunday' || weekday === 'Saturday';

This way you are Locale independent.

Upvotes: 10

Praveen
Praveen

Reputation: 133

var d = new Date();
var n = d.getDay();
 if( n == 6 )
console.log("Its weekend!!");
else
console.log("Its not weekend");

Upvotes: -1

user1949536
user1949536

Reputation: 594

Short and sweet.

var isWeekend = ([0,6].indexOf(new Date().getDay()) != -1);

Upvotes: 13

Muhammad Usama
Muhammad Usama

Reputation: 247

Simply add 1 before modulo

var isWeekend = (yourDateObject.getDay() + 1) % 7 == 0;

Upvotes: -3

kennebec
kennebec

Reputation: 104780

var isWeekend = yourDateObject.getDay()%6==0;

Upvotes: 63

Related Questions