1 | const XDate = require('xdate');
|
2 |
|
3 | function sameMonth(a, b) {
|
4 | return a instanceof XDate && b instanceof XDate &&
|
5 | a.getFullYear() === b.getFullYear() &&
|
6 | a.getMonth() === b.getMonth();
|
7 | }
|
8 |
|
9 | function sameDate(a, b) {
|
10 | return a instanceof XDate && b instanceof XDate &&
|
11 | a.getFullYear() === b.getFullYear() &&
|
12 | a.getMonth() === b.getMonth() &&
|
13 | a.getDate() === b.getDate();
|
14 | }
|
15 |
|
16 | function isGTE(a, b) {
|
17 | return b.diffDays(a) > -1;
|
18 | }
|
19 |
|
20 | function isLTE(a, b) {
|
21 | return a.diffDays(b) > -1;
|
22 | }
|
23 |
|
24 | function fromTo(a, b) {
|
25 | const days = [];
|
26 | let from = +a, to = +b;
|
27 | for (; from <= to; from = new XDate(from, true).addDays(1).getTime()) {
|
28 | days.push(new XDate(from, true));
|
29 | }
|
30 | return days;
|
31 | }
|
32 |
|
33 | function month(xd) {
|
34 | const year = xd.getFullYear(), month = xd.getMonth();
|
35 | const days = new Date(year, month + 1, 0).getDate();
|
36 |
|
37 | const firstDay = new XDate(year, month, 1, 0, 0, 0, true);
|
38 | const lastDay = new XDate(year, month, days, 0, 0, 0, true);
|
39 |
|
40 | return fromTo(firstDay, lastDay);
|
41 | }
|
42 |
|
43 | function weekDayNames(firstDayOfWeek = 0) {
|
44 | let weekDaysNames = XDate.locales[XDate.defaultLocale].dayNamesShort;
|
45 | const dayShift = firstDayOfWeek % 7;
|
46 | if (dayShift) {
|
47 | weekDaysNames = weekDaysNames.slice(dayShift).concat(weekDaysNames.slice(0, dayShift));
|
48 | }
|
49 | return weekDaysNames;
|
50 | }
|
51 |
|
52 | function page(xd, firstDayOfWeek, showSixWeeks) {
|
53 | const days = month(xd);
|
54 | let before = [], after = [];
|
55 |
|
56 | const fdow = ((7 + firstDayOfWeek) % 7) || 7;
|
57 | const ldow = (fdow + 6) % 7;
|
58 |
|
59 | firstDayOfWeek = firstDayOfWeek || 0;
|
60 |
|
61 | const from = days[0].clone();
|
62 | const daysBefore = from.getDay();
|
63 |
|
64 | if (from.getDay() !== fdow) {
|
65 | from.addDays(-(from.getDay() + 7 - fdow) % 7);
|
66 | }
|
67 |
|
68 | const to = days[days.length - 1].clone();
|
69 | const day = to.getDay();
|
70 | if (day !== ldow) {
|
71 | to.addDays((ldow + 7 - day) % 7);
|
72 | }
|
73 |
|
74 | const daysForSixWeeks = (((daysBefore + days.length) / 6) >= 6);
|
75 |
|
76 | if (showSixWeeks && !daysForSixWeeks) {
|
77 | to.addDays(7);
|
78 | }
|
79 |
|
80 | if (isLTE(from, days[0])) {
|
81 | before = fromTo(from, days[0]);
|
82 | }
|
83 |
|
84 | if (isGTE(to, days[days.length - 1])) {
|
85 | after = fromTo(days[days.length - 1], to);
|
86 | }
|
87 |
|
88 | return before.concat(days.slice(1, days.length - 1), after);
|
89 | }
|
90 |
|
91 | module.exports = {
|
92 | weekDayNames,
|
93 | sameMonth,
|
94 | sameDate,
|
95 | month,
|
96 | page,
|
97 | fromTo,
|
98 | isLTE,
|
99 | isGTE
|
100 | };
|