使用Date.parse()出现Invalid Date问题及日期比较实现需求
解决自定义日期格式的比较与交换问题
我明白你的问题了——Date.parse() 没法正确解析你这种日-月-年 时:分的格式,所以才会抛出Invalid Date错误。这是因为ECMAScript标准里,Date.parse()对非ISO标准的日期格式(比如DD-MM-YYYY)支持很差,它默认更倾向于MM-DD-YYYY或者YYYY-MM-DD这类格式。
下面给你两种可行的解决方案,都能实现「第一个日期必须早于第二个,否则交换」的需求:
方案一:自定义日期解析函数
自己拆分日期字符串的各个部分,手动构建Date对象,这样能完全控制解析逻辑,避免格式兼容问题:
<input onchange="date()" type="text" readonly id="datetimepicker_1"/> <input onchange="date()" type="text" readonly id="datetimepicker_2"/> <script> // 解析自定义格式的日期字符串为Date对象 function parseCustomDate(dateStr) { // 拆分日期和时间部分 const [datePart, timePart] = dateStr.split(' '); // 拆分日、月、年(注意转换为数字) const [day, month, year] = datePart.split('-').map(Number); // 拆分时、分 const [hours, minutes] = timePart.split(':').map(Number); // 重要:Date构造函数的月份是从0开始的(0=1月,11=12月),所以要减1 return new Date(year, month - 1, day, hours, minutes); } function date() { const input1 = document.getElementById('datetimepicker_1'); const input2 = document.getElementById('datetimepicker_2'); // 如果有一个输入框为空,暂时不处理 if (!input1.value || !input2.value) return; const date1 = parseCustomDate(input1.value); const date2 = parseCustomDate(input2.value); // 检查日期是否有效 if (isNaN(date1.getTime()) || isNaN(date2.getTime())) { console.error('日期格式无效,请检查输入'); return; } // 比较时间:如果第一个日期晚于第二个,交换输入框的值 if (date1 > date2) { const tempValue = input1.value; input1.value = input2.value; input2.value = tempValue; } } </script>
方案二:转换为标准日期格式再解析
把DD-MM-YYYY HH:mm转换为YYYY-MM-DD HH:mm(ISO标准格式),这样Date对象就能直接正确解析了:
<input onchange="date()" type="text" readonly id="datetimepicker_1"/> <input onchange="date()" type="text" readonly id="datetimepicker_2"/> <script> // 将自定义格式转换为ISO标准格式 function convertToISOFormat(dateStr) { const [datePart, timePart] = dateStr.split(' '); const [day, month, year] = datePart.split('-'); // 重组为YYYY-MM-DD HH:mm格式 return `${year}-${month}-${day} ${timePart}`; } function date() { const input1 = document.getElementById('datetimepicker_1'); const input2 = document.getElementById('datetimepicker_2'); if (!input1.value || !input2.value) return; // 转换为标准格式后创建Date对象 const date1 = new Date(convertToISOFormat(input1.value)); const date2 = new Date(convertToISOFormat(input2.value)); if (isNaN(date1.getTime()) || isNaN(date2.getTime())) { console.error('日期格式无效,请检查输入'); return; } // 比较并交换 if (date1 > date2) { [input1.value, input2.value] = [input2.value, input1.value]; } } </script>
注意事项
- 两种方案都加入了日期有效性检查,避免因输入异常导致的逻辑错误;
- 因为你的输入框是
readonly的,所以不用担心用户手动输入错误格式,只要日期选择器输出的格式固定为DD-MM-YYYY HH:mm,这两种方案都能稳定工作。
内容的提问来源于stack exchange,提问作者Lechucico
相关产品推荐
相关产品推荐

