Skip to content

Commit fa2670e

Browse files
authored
Merge pull request #308 from gpbl/is-after-before
Add isDayAfter/isDayBefore
2 parents 72bb679 + 33f9fef commit fa2670e

File tree

7 files changed

+123
-39
lines changed

7 files changed

+123
-39
lines changed

docs/DateUtils.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@ Return `d` as a new date with `n` months added. Missing days will be added to th
1717

1818
Clone the date `d` returning a new date with the same time.
1919

20-
### isSameDay `(d1: ?Date, d2: ?Date) ⇒ Bool`
20+
### isDayAfter `(day1: ?Date, day2: ?Date) ⇒ Bool`
2121

22-
Return `true` if the two dates `d1` and `d2` are the same day, e.g. ignoring their time.
22+
Return `true` if the first day is after the second day.
2323

24-
### isPastDay `(d: Date) ⇒ Bool`
24+
### isDayBefore `(day1: ?Date, day2: ?Date) ⇒ Bool`
2525

26-
Returns `true` if `d` is in the past, e.g. is yesterday or any day before yesterday.
26+
Return `true` if the first day is before the second day.
2727

28-
### isFutureDay `(d: Date) ⇒ Bool`
28+
### isSameDay `(day1: ?Date, day2: ?Date) ⇒ Bool`
2929

30-
Returns `true` if `d` is in the future, e.g. is tomorrow or any day after tomorrow.
30+
Return `true` if `day1` and `day2` are the same day.
3131

32-
### isDayBetween `(day: Date, d1: Date, d2: Date) ⇒ Bool`
32+
### isPastDay `(day: Date) ⇒ Bool`
3333

34-
Returns `true` if `day` is between the days `d1` and `d2`, without including those days.
34+
Returns `true` if `day` is in the past, e.g. is yesterday or any day before yesterday.
35+
36+
### isFutureDay `(day: Date) ⇒ Bool`
37+
38+
Returns `true` if `day` is in the future, e.g. is tomorrow or any day after tomorrow.
39+
40+
### isDayBetween `(day: Date, day1: Date, day2: Date) ⇒ Bool`
41+
42+
Returns `true` if `day` is between the days `day1` and `day2`, without including those days.
3543

3644
### addDayToRange `(day: Date, range: ?object<from: ?Date, to: ?Date>) ⇒ Object<from: ?Date, to: ?Date>`
3745

examples/src/examples/RangeAdvanced.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const initialState = {
1313

1414
function isSelectingFirstDay(from, to, day) {
1515
const firstDayIsNotSelected = !from;
16-
const selectedDayIsBeforeFirstDay = day < from;
16+
const selectedDayIsBeforeFirstDay = DateUtils.isDayBefore(day, from);
1717
const rangeIsSelected = from && to;
1818
return (
1919
firstDayIsNotSelected || selectedDayIsBeforeFirstDay || rangeIsSelected

src/DateUtils.js

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,34 @@ export function isSameDay(d1, d2) {
3737
);
3838
}
3939

40+
/**
41+
* Returns `true` if the first day is before the second day.
42+
*
43+
* @export
44+
* @param {Date} d1
45+
* @param {Date} d2
46+
* @returns {Boolean}
47+
*/
48+
export function isDayBefore(d1, d2) {
49+
const day1 = clone(d1).setHours(0, 0, 0, 0);
50+
const day2 = clone(d2).setHours(0, 0, 0, 0);
51+
return day1 < day2;
52+
}
53+
54+
/**
55+
* Returns `true` if the first day is after the second day.
56+
*
57+
* @export
58+
* @param {Date} d1
59+
* @param {Date} d2
60+
* @returns {Boolean}
61+
*/
62+
export function isDayAfter(d1, d2) {
63+
const day1 = clone(d1).setHours(0, 0, 0, 0);
64+
const day2 = clone(d2).setHours(0, 0, 0, 0);
65+
return day1 > day2;
66+
}
67+
4068
/**
4169
* Return `true` if a day is in the past, e.g. yesterday or any day
4270
* before yesterday.
@@ -47,7 +75,7 @@ export function isSameDay(d1, d2) {
4775
export function isPastDay(d) {
4876
const today = new Date();
4977
today.setHours(0, 0, 0, 0);
50-
return d < today;
78+
return isDayBefore(d, today);
5179
}
5280

5381
/**
@@ -74,13 +102,11 @@ export function isFutureDay(d) {
74102
*/
75103
export function isDayBetween(d, d1, d2) {
76104
const date = clone(d);
77-
const date1 = clone(d1);
78-
const date2 = clone(d2);
79-
80105
date.setHours(0, 0, 0, 0);
81-
date1.setHours(0, 0, 0, 0);
82-
date2.setHours(0, 0, 0, 0);
83-
return (date1 < date && date < date2) || (date2 < date && date < date1);
106+
return (
107+
(isDayAfter(date, d1) && isDayBefore(date, d2)) ||
108+
(isDayAfter(date, d2) && isDayBefore(date, d1))
109+
);
84110
}
85111

86112
/**
@@ -98,14 +124,14 @@ export function addDayToRange(day, range = { from: null, to: null }) {
98124
} else if (from && to && isSameDay(from, to) && isSameDay(day, from)) {
99125
from = null;
100126
to = null;
101-
} else if (to && day < from) {
127+
} else if (to && isDayBefore(day, from)) {
102128
from = day;
103129
} else if (to && isSameDay(day, to)) {
104130
from = day;
105131
to = day;
106132
} else {
107133
to = day;
108-
if (to < from) {
134+
if (isDayBefore(to, from)) {
109135
to = from;
110136
from = day;
111137
}

src/Helpers.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { clone, isSameDay, isDayInRange } from './DateUtils';
1+
import {
2+
clone,
3+
isSameDay,
4+
isDayInRange,
5+
isDayAfter,
6+
isDayBefore,
7+
} from './DateUtils';
28
import { getFirstDayOfWeek } from './LocaleUtils';
39

410
export function cancelEvent(e) {
@@ -71,10 +77,10 @@ export function getModifiersForDay(d, modifiersObj = {}) {
7177
return isDayInRange(d, range);
7278
}
7379
if (day.after) {
74-
return d > day.after;
80+
return isDayAfter(d, day.after);
7581
}
7682
if (day.before) {
77-
return d < day.before;
83+
return isDayBefore(d, day.before);
7884
}
7985
if (typeof day === 'function' && day(d)) {
8086
return true;
@@ -87,10 +93,10 @@ export function getModifiersForDay(d, modifiersObj = {}) {
8793
} else if (isRangeOfDates(value) && isDayInRange(d, value)) {
8894
// modifier's value is a range
8995
modifiers.push(modifier);
90-
} else if (value.after && d > value.after) {
96+
} else if (value.after && isDayAfter(d, value.after)) {
9197
// modifier's value has an after date
9298
modifiers.push(modifier);
93-
} else if (value.before && d < value.before) {
99+
} else if (value.before && isDayBefore(d, value.before)) {
94100
// modifier's value has an after date
95101
modifiers.push(modifier);
96102
} else if (typeof value === 'function' && value(d)) {

test/DateUtils.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,48 @@ describe('DateUtils', () => {
2929
});
3030
});
3131

32+
describe('isDayBefore', () => {
33+
it('returns true when the day is before the other day', () => {
34+
const day1 = new Date(2015, 10, 11, 5, 25);
35+
const day2 = new Date(2015, 10, 12, 3, 40);
36+
const isDayBefore = DateUtils.isDayBefore(day1, day2);
37+
expect(isDayBefore).to.be.true;
38+
});
39+
it('returns false for the same day with different times', () => {
40+
const day1 = new Date(2015, 10, 11, 5, 25);
41+
const day2 = new Date(2015, 10, 11, 6, 40);
42+
const isDayBefore = DateUtils.isDayBefore(day1, day2);
43+
expect(isDayBefore).to.be.false;
44+
});
45+
it('returns false if the second day is after', () => {
46+
const day1 = new Date(2015, 10, 13, 5, 25);
47+
const day2 = new Date(2015, 10, 12, 1, 40);
48+
const isDayBefore = DateUtils.isDayBefore(day1, day2);
49+
expect(isDayBefore).to.be.false;
50+
});
51+
});
52+
53+
describe('isDayAfter', () => {
54+
it('returns true when the day is after the other day', () => {
55+
const day1 = new Date(2015, 10, 13, 5, 25);
56+
const day2 = new Date(2015, 10, 12, 3, 40);
57+
const isDayAfter = DateUtils.isDayAfter(day1, day2);
58+
expect(isDayAfter).to.be.true;
59+
});
60+
it('returns false for the same day with different times', () => {
61+
const day1 = new Date(2015, 10, 11, 5, 25);
62+
const day2 = new Date(2015, 10, 11, 6, 40);
63+
const isDayAfter = DateUtils.isDayAfter(day1, day2);
64+
expect(isDayAfter).to.be.false;
65+
});
66+
it('returns false if the second day is after', () => {
67+
const day1 = new Date(2015, 10, 12, 5, 25);
68+
const day2 = new Date(2015, 10, 13, 1, 40);
69+
const isDayAfter = DateUtils.isDayAfter(day1, day2);
70+
expect(isDayAfter).to.be.false;
71+
});
72+
});
73+
3274
describe('isSameDay', () => {
3375
it('returns true if two days differ only by time', () => {
3476
const day1 = new Date(2015, 10, 11, 5, 25);

test/Helpers.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,22 +88,22 @@ describe('Helpers', () => {
8888
expect(modifiers.indexOf('maybe')).to.equal(-1);
8989
expect(modifiers.indexOf('no')).to.equal(-1);
9090
});
91-
it('accepts a single day', () => {
91+
it('returns the modifier for a single day', () => {
9292
const modifiers = Helpers.getModifiersForDay(new Date(2015, 8, 19), {
9393
foo: new Date(2015, 8, 19),
9494
});
9595
expect(modifiers).to.have.length(1);
9696
expect(modifiers.indexOf('foo')).to.equal(0);
9797
});
98-
it('ignore falsy values', () => {
98+
it('ignores falsy values', () => {
9999
const modifiers = Helpers.getModifiersForDay(new Date(2015, 8, 19), {
100100
foo: null,
101101
bar: false,
102102
});
103103
expect(modifiers).to.have.length(0);
104104
expect(modifiers.indexOf('foo')).to.equal(-1);
105105
});
106-
it('accepts an array of days', () => {
106+
it('returns the modifier for an array of days', () => {
107107
const modifiersObj = {
108108
foo: [
109109
new Date(2015, 8, 19),
@@ -147,7 +147,7 @@ describe('Helpers', () => {
147147
expect(modifiers).to.have.length(1);
148148
expect(modifiers.indexOf('foo')).to.be.above(-1);
149149
});
150-
it('accepts a single range of days', () => {
150+
it('returns the modifier for a range of days', () => {
151151
const range = {
152152
foo: {
153153
from: new Date(2015, 8, 18),
@@ -166,7 +166,7 @@ describe('Helpers', () => {
166166
);
167167
expect(modifiers2).to.have.length(0);
168168
});
169-
it('accepts multiple ranges of days', () => {
169+
it('returns the modifier for multiple ranges of days', () => {
170170
const ranges = {
171171
foo: [
172172
{
@@ -190,7 +190,7 @@ describe('Helpers', () => {
190190
);
191191
expect(modifiers2.indexOf('foo')).to.equal(0);
192192
});
193-
it('accepts an "after" modifier', () => {
193+
it('returns an "after" modifier', () => {
194194
const afterModifier = {
195195
foo: {
196196
after: new Date(2015, 8, 18),
@@ -203,7 +203,7 @@ describe('Helpers', () => {
203203
expect(modifiers).to.have.length(1);
204204
expect(modifiers.indexOf('foo')).to.equal(0);
205205
});
206-
it('accepts an "after" modifier in an array of days', () => {
206+
it('returns an "after" modifier in an array of days', () => {
207207
const afterModifier = {
208208
foo: [{ after: new Date(2015, 8, 18) }],
209209
};
@@ -214,20 +214,20 @@ describe('Helpers', () => {
214214
expect(modifiers).to.have.length(1);
215215
expect(modifiers.indexOf('foo')).to.equal(0);
216216
});
217-
it('accepts a "before" modifier', () => {
218-
const afterModifier = {
217+
it('returns a "before" modifier', () => {
218+
const beforeModifier = {
219219
foo: {
220220
before: new Date(2015, 8, 15),
221221
},
222222
};
223223
const modifiers = Helpers.getModifiersForDay(
224224
new Date(2015, 8, 10),
225-
afterModifier
225+
beforeModifier
226226
);
227227
expect(modifiers).to.have.length(1);
228228
expect(modifiers.indexOf('foo')).to.equal(0);
229229
});
230-
it('accepts a "before" modifier in an array of days', () => {
230+
it('returns a "before" modifier in an array of days', () => {
231231
const afterModifier = {
232232
foo: [{ before: new Date(2015, 8, 15) }],
233233
};
@@ -238,7 +238,7 @@ describe('Helpers', () => {
238238
expect(modifiers).to.have.length(1);
239239
expect(modifiers.indexOf('foo')).to.equal(0);
240240
});
241-
it('work with a mix of functions and days', () => {
241+
it('works with mixing functions and other objects', () => {
242242
const mixedModifiers = {
243243
foo: [
244244
{ before: new Date(2015, 8, 15) },

types/index.d.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@ declare namespace DayPicker {
1212
}
1313

1414
interface DateUtils {
15+
addDayToRange(day: Date, range: RangeModifier): RangeModifier;
1516
addMonths(d: Date, n: number): Date;
1617
clone(d: Date): Date;
17-
isSameDay(d1: Date, d2: Date): Date;
18-
isPastDay(d: Date): boolean;
19-
isFutureDay(d: Date): boolean;
18+
isDayAfter(day1: Date, day2: Date): boolean;
19+
isDayBefore(day1: Date, day2: Date): boolean;
2020
isDayBetween(day: Date, begin: Date, end: Date): boolean;
21-
addDayToRange(day: Date, range: RangeModifier): RangeModifier;
2221
isDayInRange(day: Date, range: RangeModifier): boolean;
22+
isFutureDay(day: Date): boolean;
23+
isPastDay(day: Date): boolean;
24+
isSameDay(day1: Date, day2: Date): boolean;
2325
}
2426

2527
interface CaptionElementProps {

0 commit comments

Comments
 (0)