1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-06-03 06:22:34 +02:00
TableFilter/src/date.js

173 lines
5.5 KiB
JavaScript
Raw Normal View History

2014-11-16 01:29:07 +01:00
/**
* Date utilities
*/
2015-05-30 14:23:33 +02:00
export default {
isValid(dateStr, format){
2014-11-16 01:29:07 +01:00
if(!format) {
format = 'DMY';
}
format = format.toUpperCase();
if(format.length != 3) {
if(format === 'DDMMMYYYY'){
2015-05-30 14:23:33 +02:00
let d = this.format(dateStr, format);
2014-11-16 01:29:07 +01:00
dateStr = d.getDate() +'/'+ (d.getMonth()+1) +'/'+
d.getFullYear();
format = 'DMY';
}
}
if((format.indexOf('M') === -1) || (format.indexOf('D') === -1) ||
(format.indexOf('Y') === -1)){
format = 'DMY';
}
2015-05-30 14:23:33 +02:00
let reg1, reg2;
2014-11-16 01:29:07 +01:00
// If the year is first
if(format.substring(0, 1) === 'Y') {
2015-12-25 03:06:54 +01:00
reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
} else if(format.substring(1, 2) === 'Y') { // If the year is second
2015-12-25 03:06:54 +01:00
reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/;
reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/;
2014-11-16 01:29:07 +01:00
} else { // The year must be third
2015-12-25 03:06:54 +01:00
reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/;
reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
2014-11-16 01:29:07 +01:00
}
2015-05-15 16:26:21 +02:00
// If it doesn't conform to the right format (with either a 2 digit year
// or 4 digit year), fail
2014-11-16 01:29:07 +01:00
if(reg1.test(dateStr) === false && reg2.test(dateStr) === false) {
return false;
}
// Split into 3 parts based on what the divider was
2015-05-30 14:23:33 +02:00
let parts = dateStr.split(RegExp.$1);
let mm, dd, yy;
2014-11-16 01:29:07 +01:00
// Check to see if the 3 parts end up making a valid date
if(format.substring(0, 1) === 'M'){
mm = parts[0];
} else if(format.substring(1, 2) === 'M'){
mm = parts[1];
} else {
mm = parts[2];
}
if(format.substring(0, 1) === 'D'){
dd = parts[0];
} else if(format.substring(1, 2) === 'D'){
dd = parts[1];
} else {
dd = parts[2];
}
if(format.substring(0, 1) === 'Y'){
yy = parts[0];
} else if(format.substring(1, 2) === 'Y'){
yy = parts[1];
} else {
yy = parts[2];
}
if(parseInt(yy, 10) <= 50){
yy = (parseInt(yy, 10) + 2000).toString();
}
if(parseInt(yy, 10) <= 99){
yy = (parseInt(yy, 10) + 1900).toString();
}
2015-05-30 14:23:33 +02:00
let dt = new Date(
2014-11-16 01:29:07 +01:00
parseInt(yy, 10), parseInt(mm, 10)-1, parseInt(dd, 10),
0, 0, 0, 0);
if(parseInt(dd, 10) != dt.getDate()){
return false;
}
if(parseInt(mm, 10)-1 != dt.getMonth()){
return false;
}
return true;
},
2015-05-30 14:23:33 +02:00
format(dateStr, formatStr) {
if(!formatStr){
formatStr = 'DMY';
2014-11-16 01:29:07 +01:00
}
if(!dateStr || dateStr === ''){
return new Date(1001, 0, 1);
}
2015-05-30 14:23:33 +02:00
let oDate;
2015-06-09 10:46:08 +02:00
let parts;
2014-11-16 01:29:07 +01:00
2015-05-30 14:23:33 +02:00
switch(formatStr.toUpperCase()){
2014-11-16 01:29:07 +01:00
case 'DDMMMYYYY':
parts = dateStr.replace(/[- \/.]/g,' ').split(' ');
oDate = new Date(y2kDate(parts[2]),mmm2mm(parts[1])-1,parts[0]);
2016-02-22 08:14:58 +01:00
break;
2014-11-16 01:29:07 +01:00
case 'DMY':
2016-02-16 08:41:47 +01:00
/* eslint-disable */
2014-11-16 01:29:07 +01:00
parts = dateStr.replace(
/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' ');
oDate = new Date(y2kDate(parts[2]),parts[1]-1,parts[0]);
2016-02-16 08:41:47 +01:00
/* eslint-enable */
2016-02-22 08:14:58 +01:00
break;
2014-11-16 01:29:07 +01:00
case 'MDY':
2016-02-16 08:41:47 +01:00
/* eslint-disable */
2014-11-16 01:29:07 +01:00
parts = dateStr.replace(
/^(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' ');
oDate = new Date(y2kDate(parts[2]),parts[0]-1,parts[1]);
2016-02-16 08:41:47 +01:00
/* eslint-enable */
2016-02-22 08:14:58 +01:00
break;
2014-11-16 01:29:07 +01:00
case 'YMD':
2016-02-16 08:41:47 +01:00
/* eslint-disable */
2014-11-16 01:29:07 +01:00
parts = dateStr.replace(/^((\d\d)?\d\d)([- \/.])(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])$/,'$1 $4 $6').split(' ');
oDate = new Date(y2kDate(parts[0]),parts[1]-1,parts[2]);
2016-02-16 08:41:47 +01:00
/* eslint-enable */
2016-02-22 08:14:58 +01:00
break;
2014-11-16 01:29:07 +01:00
default: //in case format is not correct
2016-02-16 08:41:47 +01:00
/* eslint-disable */
2014-11-16 01:29:07 +01:00
parts = dateStr.replace(/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' ');
oDate = new Date(y2kDate(parts[2]),parts[1]-1,parts[0]);
2016-02-16 08:41:47 +01:00
/* eslint-enable */
2016-02-22 08:14:58 +01:00
break;
2014-11-16 01:29:07 +01:00
}
return oDate;
}
};
2015-05-15 16:26:21 +02:00
function y2kDate(yr){
if(yr === undefined){
return 0;
}
if(yr.length>2){
return yr;
}
2015-05-30 14:23:33 +02:00
let y;
2015-05-15 16:26:21 +02:00
//>50 belong to 1900
if(yr <= 99 && yr>50){
y = '19' + yr;
}
//<50 belong to 2000
if(yr<50 || yr === '00'){
y = '20' + yr;
}
return y;
}
function mmm2mm(mmm){
if(mmm === undefined){
return 0;
}
2015-05-30 14:23:33 +02:00
let mondigit;
let MONTH_NAMES = [
2015-05-15 16:26:21 +02:00
'january','february','march','april','may','june','july',
'august','september','october','november','december',
'jan','feb','mar','apr','may','jun','jul','aug','sep','oct',
'nov','dec'
];
2015-05-30 14:23:33 +02:00
for(let m_i=0; m_i < MONTH_NAMES.length; m_i++){
2016-02-22 08:14:58 +01:00
let month_name = MONTH_NAMES[m_i];
if (mmm.toLowerCase() === month_name){
mondigit = m_i+1;
break;
}
2015-05-15 16:26:21 +02:00
}
if(mondigit > 11 || mondigit < 23){
mondigit = mondigit - 12;
}
if(mondigit < 1 || mondigit > 12){
return 0;
}
return mondigit;
}