I recently had a project where I had to extract the date range between two sets of overlapping date ranges in JavaScript*.
Let’s say our user wanted to see any overlapping date ranges between "2024-09-01" and "2024-09-16". For the following set of date ranges:
"29 August 2024" – "18 September 2024"
"3 September 2024" – " 10 September 2024"
"3 September 2024" – "18 September 2024"
"29 August 2024" – "10 September 2024"
"20 August 2024" – "29 August 2024"
"18 September 2024" – "25 September 2024"
Here’s a more visual example:
In my project, this represented many thousands of ranges to search, but we have a good sample here for testing.
Our expected returned results should only provide overlapping ranges that fit inside the target range, chopping off any excess dates. So the results would look a little like this:
1 Sep 2024 – 16 Sep 2024
3 Sep 2024 – 10 Sep 2024
3 Sep 2024 – 16 Sep 2024
1 Sep 2024 – 10 Sep 2024
null
null
*Well… It was actually a Google Apps Script project, but same-same 😉.
The following code provides a sample set of date ranges called dates that are compared against a target start (tgtStart) and end (tgtEnd) date range.
The script then iterates over the dates running the getDateRangeOverLap() function to compare the currently iterated date ranges against the target ranges.
If there is an overlap, then the overlapping date range is returned. If there is no overlap, then null is returned.
Finally, the script logs the response from the function displaying the current range and the newly updated overlap range, or null.
The different date formats are just to illustrate that any JavaScript date format can be used here.
Go ahead and make a copy of the script and give it a run in your favourite IDE.
getDateRangeOverLaps()
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// EXTRACTING OVERLAPPING DATE RANGES BETWEEN TWO RANGES OF DATES IN JAVASCRIPT
It is faster for the function to check if there are no overlapping dates between our current date range and our target range rather than to work through the nuances of the different overlap updates we need to do.
Here we check if our current range start epoch is greater than the target end epoch or if the current end epoch is less than the target start epoch. If either of these conditions are met, we return null.
Otherwise, we can run through the other conditions below.
Check if the Current date range encompasses the entire target date range
In this situation, the current date range starts before the target date and ends after the target date. In this case, the overlapping range will be the same as the target date.
Check if the current start and end range fit inside the target range.
In this condition, we check if the current date range starts before the target range but also ends before the target range. In this case, we return the target start date and the current end date.
Check if the current date range starts within the target date
For the final condition check we determine if the current range starts within the target range but ends after the target range. If this condition is met, then we return the current start range and the target end range.
That’s all there is to it.
I’d love to hear how you applied this or tweaked it for your own projects.
Earth doesn’t perfectly orbit the Sun every 365 days. Rather, it irritatingly must make its orbit in oh, I don’t know, roughly 365.242190 days each year.
Due to this inconsiderate behaviour, we must add a leap year into our common calendar known as the Gregorian Calendar.
Like, I presume, many of us, I thought a leap year occurred every four years.
Whether it was a matter of being taught a half-truth from my school teachers many decades ago in School (possible), or simply not paying attention to said teachers (much much more possible), I was wrong on this account.
So, when is a leap year?
According to the very impressively sounding Royal Museum Greenwich, a leaps year must meet the following conditions:
Any year that is a century (e.g. 2000, 2100, 2400, 1900) must be divisible by 400. So 2000 and, 2400 are leap years but 2100 and, 1900 are not.
Any other year must be divisible by 4.
Yeap. It’s that first one, I didn’t know about.
So with this in mind, how would we determine if a year is a leap year in JavaScript?
Enter the JavaScript Modulo Operator
To determine if something is divisible by a number we can use the JavaScript modulo operator (%) to determine the remainder. If the remainder is zero we know it is divisible by a number.
So 12%4 would return 0 because 12 divides perfectly into three lots of four. Whereas 7%3 would have one left over.
Let’s now create a function called isLeapYear() that takes a four-digit number for our target year.
Remember our leap years rules.
We need to:
Check if the year is divisible by 400 (year%400 == 0)
Check if the year is divisible by 4 (year%4 == 0)
If it is, then:
Check if the year isn’t divisible by 100 (year%100 != 0).
isLeapYear()
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// CHECK IF THE TARGET YEAR IS A LEAP YEAR IN JAVASCRIPT
functionisLeapYear(year){
returnyear%400==0||(year%4==0&&year%100!=0)
}
constyearTestArray=[
2000,
2001,
2100,
2200,
2400,
2024,
2025,
1900,
]
constresult=yearTestArray.map(year=>{
return{
year,
isLeapYear:isLeapYear(year)
}
})
console.table(result)
Give it a run to see the results.
Results
1
2
3
4
5
6
7
8
9
10
11
12
┌─────────┬──────┬────────────┐
│(index)│year│isLeapYear│
├─────────┼──────┼────────────┤
│0│2000│true│
│1│2001│false│
│2│2100│false│
│3│2200│false│
│4│2400│true│
│5│2024│true│
│6│2025│false│
│7│1900│false│
└─────────┴──────┴────────────┘
Why not just use the Date object?
I actually did this in a previous tutorial to get a list of days of the year a particular weekday (e.g. Monday, Tuesday, Wednesday…etc) falls. You can check it out here:
This guide is designed to help you quickly solve issues related to running scripts from custom-built dialogue boxes in Google Sheets, Docs, Forms and Slides, most notably, the “ACCESS DENIED” error and other related errors.