JS如何将出生日期格式从YYYY/MM/DD改为DD/MM/YYYY或DD-MM-YYYY
解决方案(以优先需求DD-MM-YYYY格式为例)
仅需要修改4处代码即可,原有格式化核心逻辑无需调整:
- 替换格式化配置变量
把原来的DATE_FORMAT和DATE_PLACEHOLDER修改为:
const DATE_FORMAT = '**-**-****' const DATE_PLACEHOLDER = 'DD-MM-YYYY'
如果需要退而求其次的DD/MM/YYYY格式,就改成:
const DATE_FORMAT = '**/**/****' const DATE_PLACEHOLDER = 'DD/MM/YYYY'
- 修改验证规则的正则表达式
找到出生日期校验部分的正则,替换为匹配DD-MM-YYYY的规则:
if (/^\d\d-\d\d-\d\d\d\d$/.test(field.value)) {
如果是DD/MM/YYYY格式就替换为:
if (/^\d\d\/\d\d\/\d\d\d\d$/.test(field.value)) {
- 调整日期拆分顺序
原来的拆分是按年/月/日顺序,现在改为按日/月/年顺序读取:
let [dd, mm, yyyy] = field.value.split('-').map(p => parseInt(p, 10))
如果是DD/MM/YYYY格式就把分隔符换成/:
let [dd, mm, yyyy] = field.value.split('/').map(p => parseInt(p, 10))
完整修改后的代码参考
格式化部分代码
'use strict' // DD-MM-YYYY格式配置 const DATE_FORMAT = '**-**-****' const DATE_PLACEHOLDER = 'DD-MM-YYYY' const birthdate = document.querySelector('#birthdate') function DoFormat(x, pattern, mask) { var strippedValue = x.replace(/[^0-9]/g, '') var chars = strippedValue.split('') var count = 0 var formatted = '' for (let i = 0; i < pattern.length; i++) { const c = pattern[i] if (chars[count]) { if (/\*/.test(c)) { formatted += chars[count] count++ } else { formatted += c } } else if (mask) { if (mask.split('')[i]) formatted += mask.split('')[i] } } return formatted; } function Format() { const val = DoFormat(birthdate.value, DATE_FORMAT) birthdate.value = DoFormat(birthdate.value, DATE_FORMAT, DATE_PLACEHOLDER) if (birthdate.createTextRange) { var range = birthdate.createTextRange() range.move('character', val.length) range.select() } else if (birthdate.selectionStart) { birthdate.focus() birthdate.setSelectionRange(val.length, val.length) } } Format() birthdate.addEventListener('input', Format)
校验部分代码
if (field.id === 'birthdate') { // 匹配DD-MM-YYYY格式 if (/^\d\d-\d\d-\d\d\d\d$/.test(field.value)) { // 按日、月、年的顺序拆分 let [dd, mm, yyyy] = field.value.split('-').map(p => parseInt(p, 10)) mm -= 1 const date = new Date(yyyy, mm, dd) if (date.getMonth() === mm && date.getDate() === dd && date.getFullYear() === yyyy) { if (date.getFullYear() >= LOWEST_YEAR && date.getFullYear() <= HIGHEST_YEAR) { return true } } } this.Error(field) return false }
内容的提问来源于stack exchange,提问作者Avanae
相关产品推荐
相关产品推荐

