我们在日常开发中,很多时候需要从系统外抓取数据到系统中,比如通过excel导入数据,对于客户端来源的日期格式千奇百怪,要导入系统中,我们必须进行数据清洗
外部数据源导入
对应交互型数据,我们可以在前端处理,对于大数据量的表册之类我们一般在后端处理,我们要判断是否预定义的日期格式类型,处理成标准的日期时间格式,如果不是则抛弃,导入正确的数据,对于日期格式,我们分为严格模式和非严格模式,严格模式只要不是预定义日期格式,则狠心地抛弃,非严格模式,我们先预处理日期,然后再判断非日期,则抛弃,我们按非严格模式处理
通过前面几章的分析,我们了解了对于C#来说,这个哥们是个莽汉子,耐操,对于只要不是暴恐的妹纸他都能接受,但是对于Java来说,这个哥们就是个精英人物了,一点不符合格式都不菜你,比如下面这种格式
2020-5-20
2020-5-20 14:3:8
按常识来说,这个是个常见的正确日期格式,MD,他就是不理睬你,就是要exception,安排,下面我们来统一解决处理他
1.对严格模式下标准日期的预处理
我们系统大概率都接受日期标准格式应该是:yyyy-MM-dd(年-月-日) yyyy-MM-dd HH:mm:ss(年-月-日 时:分:秒)
//JavaScript code:
const regex = /(d{4})(?:[u4e00-u9fa5]|[_./-])?(d{2})(?:[u4e00-u9fa5]|[_./-])?(d{2})s?((?:d{2}:?){0,3})/gm;
const str = `rn
- 20210305 rn
- 2021-03-05 rn
- 2021_03_05 rn
- 2021.03.05 rn
- 2021/03/05 rn
- 2021年03月05 rn
- 2021-03-05 12:23:23 rn`;
const subst = `$1-$2-$3 $4`;
// 替换的值将会被包含在结果变量中
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
通过上面的正则,我们能把常见的满足位数的日期检索出来转换成标准日期格式
严格模式下的日期字符串处理
2.对单月的格式补位处理
对用户录入的:yyyy-M-dd格式为yyyy-MM-dd处理
//JavaScript code:
const regex = /(d{4})(?:[_./-])?(d)(?:[_./-])?(d{2})s?((?:d{2}:?){0,3})/gm;
const str = "2021-3-05";
const subst = `$1-0$2-$3 $4`;
// 替换的值将会被包含在结果变量中
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
处理结果:
单月格式化补位处理
3.对单日的补位处理
对用户录入的:yyyy-MM-d格式为yyyy-MM-dd处理
const regex = /(d{4})(?:[_./-])?(d{2})(?:[_./-])?(d)s?((?:d{2}:?){0,3})/gm;
const str = "2021-03-5";
const subst = `$1-$2-0$3 $4`;
// 替换的值将会被包含在结果变量中
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
处理结果:
单日补位格式化处理
4.对单月单日的补位处理
对用户录入的:yyyy-M-d格式为yyyy-MM-dd处理
const regex = /(d{4})(?:[_./-])?(d)(?:[_./-])?(d)s?((?:d{2}:?){0,3})/gm;
const str = "2021-3-5";
const subst = `$1-0$2-0$3 $4`;
// 替换的值将会被包含在结果变量中
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
处理结果:
单月单日补位格式化处理
通过上面一套组合拳,我们能把大部分的日期格式字符处理成标准的yyyy-MM-dd HH:mm:ss,那么在主流的高级语言中基本都认识这家伙了,我们也可以根据这个标准写出判断日期的函数,当然这里仅仅是对格式的处理,对数据有效性还需要进一步处理,比如用户录入1000-09-09这种通过我们的逻辑也是能导入数据库的,如果有必要对有效性进行处理,那么同理根据自己的业务逻辑在继续蹂躏他就行了。