Check if a JavaScript date is inside business hours
Checking if a given date is inside business hours is a fairly important piece of code that most developers need to write at some point. Luckily, JavaScript's Date
object makes it easy to work with dates and times.
Using the Date
object
The Date
object in JavaScript provides a number of methods to work with dates and times. We can use Date.prototype.getDay()
and Date.prototype.getHours()
methods to get the day of the week and the hour of the day, respectively.
Then, we can use a simple comparison to check if the date is inside business hours, by checking if the day is between 1
(Monday) and 5
(Friday) and if the hour is between 9
(9 AM) and 17
(5 PM).
const startDay = 1; // Monday const endDay = 5; // Friday const startHour = 9; // 9:00 AM const endHour = 17; // 5:00 PM const isInsideBusinessHours = (date = new Date()) => { const day = date.getDay(); const hour = date.getHours(); return day >= startDay && day <= endDay && hour >= startHour && hour < endHour; };
Using Intl.DateTimeFormat
for specific timezones
Depending on where you are in the world and if your users are on the same timezone, you might want to get the time for a specific timezone. This is significantly more involved, but can be done using Intl.DateTimeFormat
.
Using the Intl.DateTimeFormat()
constructor with appropriate options, we can format the date and time in a specific timezone. We can then use the Intl.DateTimeFormat.prototype.formatToParts()
method to get the date and time as an array of objects, which we can then parse to get the weekday
, day
, month
, and hour
.
Having this segments, we can compare them to the start and end hours to check if the date is inside business hours. Additionally, we can also check if the date is a weekday or a weekend, and check if it's a holiday by comparing it to a list of holidays.
const holidays = [ [1, 1], // New Year's Day [6, 1], // Epiphany [25, 3], // Greek Independence Day [1, 5], // Labour Day [15, 8], // Dormition of the Holy Virgin [28, 10], // Ochi Day [25, 12], // Christmas Day [26, 12] // Boxing Day ]; const dateTimeFormatOptions = { timeZone: 'Europe/Athens', year: 'numeric', month: 'numeric', day: 'numeric', weekday: 'narrow', hour: 'numeric', hour12: false, minute: 'numeric' }; const startHour = 9, endHour = 17; const isInsideHours = (hour) => hour >= startHour && hour < endHour; const isWeekday = (weekday) => weekday !== 'S'; const isHoliday = (day, month) => holidays.some(([hDay, hMonth]) => hDay === day && hMonth === month); const parseDateSegments = (date = new Date()) => new Intl.DateTimeFormat('en-US', dateTimeFormatOptions) .formatToParts(date) .reduce((acc, part) => { const { type, value } = part; if (type === 'weekday') acc.weekday = value; else if (type !== 'literal') acc[type] = parseInt(value, 10); return acc; }, {}); export const isInsideBusinessHours = (date = new Date()) => { const { weekday, day, month, hour } = parseDateSegments(date); return isInsideHours(hour) && isWeekyday(weekday) && !isHoliday(day, month); };