-
Notifications
You must be signed in to change notification settings - Fork 0
/
date-format-validator.js
115 lines (97 loc) · 2.5 KB
/
date-format-validator.js
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
function getDateFormatRegex(dateFormat) {
let dateRegex = '';
let dateSeparator = '';
switch (dateFormat) {
case "YYYY-MM-DD":
case "yyyy-mm-dd":
dateRegex = /^\d{4}\-\d{1,2}\-\d{1,2}$/;
dateSeparator = "-";
break;
case "DD/MM/YYYY":
case "dd/mm/yyyy":
dateRegex = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
dateSeparator = "/";
break;
case "DD.MM.YYYY":
case "dd.mm.yyyy":
dateRegex = /^\d{1,2}\.\d{1,2}\.\d{4}$/;
dateSeparator = ".";
break;
default:
// MM/DD/YYYY
// mm/dd/yyyy
dateRegex = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
dateSeparator = "/";
break;
}
return {
dateRegex,
dateSeparator
}
}
function parseDateString(dateString, dateSeparator, dateFormat) {
let day = '';
let month = '';
let year = '';
let dateArray = [];
switch (dateSeparator) {
case ".":
dateArray = dateString.split(".");
day = parseInt(dateArray[1], 10);
month = parseInt(dateArray[0], 10);
year = parseInt(dateArray[2], 10);
break;
case "-":
dateArray = dateString.split("-");
day = parseInt(dateArray[2], 10);
month = parseInt(dateArray[1], 10);
year = parseInt(dateArray[0], 10);
break;
default:
dateArray = dateString.split("/");
if (dateFormat === "DD/MM/YYYY" || dateFormat === "dd/mm/yyyy") {
day = parseInt(dateArray[0], 10);
month = parseInt(dateArray[1], 10);
year = parseInt(dateArray[2], 10);
} else {
day = parseInt(dateArray[1], 10);
month = parseInt(dateArray[0], 10);
year = parseInt(dateArray[2], 10);
}
break;
}
return {
day,
month,
year
}
}
function monthDaysArray(year) {
let monthsDays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
// Adjust for leap years
if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
monthsDays[1] = 29;
}
return monthsDays;
}
/**
*
* @param options object containing dateString, dateFormat
*/
export default function isValidDate(options) {
let dateFormat = '';
if (!options.dateFormat) {
dateFormat = 'mm/dd/yyyy';
}
const { dateRegex, dateSeparator } = getDateFormatRegex(dateFormat);
if (!dateRegex.test(options.dateString)) {
return false;
}
const { day, month, year} = parseDateString(options.dateString, dateSeparator, options.dateFormat);
// month & days range
if (year < 1000 || year > 3000 || month == 0 || month > 12) {
return false;
}
let monthDays = monthDaysArray(year);
return day > 0 && day <= monthDays[month - 1];
}