You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:27:56