【问题标题】:JavaScript - making sure a date is validJavaScript - 确保日期有效
【发布时间】:2012-03-19 21:54:59
【问题描述】:

我有 3 个下拉框来显示开始日期(日/月/年)。我还有 3 个要显示结束日期。

我想验证一下

  • 用户选择了一个有效的日期(即不是 2 月 30 日)。如果他们选择了无效的日期,则 alert("Your date is invalid.")
  • 开始日期和结束日期之间的天数差小于 7。

我真的很挣扎,希望有人可以帮助我作为一个相对初学者。

到目前为止我的代码如下:

<script type="text/javascript">
    var monthtext=["01","02","03","04","05","06","07","08","09","10","11","12"];

    function populatedropdown(dayfield, monthfield, yearfield){
    var today=new Date()
    var dayfield=document.getElementById(dayfield)
    var monthfield=document.getElementById(monthfield)
    var yearfield=document.getElementById(yearfield)
    for (var i=0; i<=31; i++)
       dayfield.options[i]=new Option(i, i)
    dayfield.options[today.getDate()]=new Option(today.getDate(), today.getDate(),     true, true) //select today's day
    for (var m=0; m<12; m++)
      monthfield.options[m]=new Option(monthtext[m], monthtext[m])
    monthfield.options[today.getMonth()]=new Option(monthtext[today.getMonth()], monthtext[today.getMonth()], true, true) //select today's month
    var thisyear=today.getFullYear()
    for (var y=0; y<4; y++){
      yearfield.options[y]=new Option(thisyear, thisyear)
      thisyear+=1
    }
    yearfield.options[0]=new Option(today.getFullYear(), today.getFullYear(), true, true) //select today's year
    }
</script>

HTML:

        <label>Start date :</label>
            <select name="startDateDay" id="startDaydropdown"></select> 
            <select name="startDateMonth" id="startMonthdropdown"></select> 
            <select name="startDateYear" id="startYeardropdown"></select>

        <label>End date :</label>
            <select name="endDateDay" id="endDaydropdown"></select> 
            <select name="endDateMonth" id="endMonthdropdown"></select> 
            <select name="endDateYear" id="endYeardropdown"></select>

【问题讨论】:

  • 您可以在不允许用户选择过去日期的地方使用 jquery datepicker。然后将 to 部分中的 to date 从提前 7 天开始。

标签: javascript html date validation


【解决方案1】:

为什么不只用两个文本字段让用户输入日期,然后让new Date(textfield.value) 完成日期验证的繁重工作?

那么您只需要确定日期是否在彼此之间的 7 天内。您可以使用Date object 轻松完成该部分,或许只需以下简单的操作:

var dateDiff = date2.getTime()  - date1.getTime();
if(dateDiff <= 1000*60*60*24*7 && dateDiff > 0) {
    return 'valid';
} else {
    return 'invalid';
}

如果将此作为提交按钮的一部分运行,您的代码将类似于:

function validateDatesOnSubmit() {
    var date1 = new Date(document.getElementById('startDate').value);
    var date2 = new Date(document.getElementById('endDate').value);
    if(date1 == "Invalid Date" || date2 == "Invalid Date") {
        alert("You have entered an invalid date, please fix this.");
        return false;
    }
    var dateDiff = date2.getTime() - date1.getTime();
    if(dateDiff <= 1000*60*60*24*7 && dateDiff >= 0) {
        return true;
    } else {
        alert("You have entered a range beyond one week, please reduce the number of days selected.");
        return false;
    }
}
document.getElementById('myForm').onsubmit = validateDatesOnSubmit;

【讨论】:

  • 感谢您的回复。我现在正在尝试这样做。在这种情况下,我的 JavaScript 函数会是什么?我现在正在尝试编写它,但是在提取值并将它们正确放入 JavaScript 时遇到了困难。
  • 好吧,你希望它什么时候调用?当他们点击提交按钮时?
  • 如果可能的话那将是完美的,是的:)
  • 我用示例函数更新了答案以及如何将其附加到表单中。但我认为您需要阅读 Javascript 事件循环以及文档对象模型如何触发事件然后调用这些事件的回调;这主要是“愚蠢”的粘合代码,在这里,因此更好地理解您试图“粘合在一起”的内容将使这些事情变得显而易见。 ;)
  • @DavidEllis — 您不能依赖 Date 对象来可靠地将日期字符串解析为跨浏览器的对象。您必须手动解析它(这并不难)。
【解决方案2】:

假设日期格式为dd-mm-yyyydd/mm/yyyy 那么:

function toDate(t) {
  var t = t.split(/[-\/]/g);
  return new Date(t[2],t[1] - 1, t[0]);
}

function within7Days(t0, t1) {
  var d0 = toDate(t0);
  var d1 = toDate(t1);
  return d0.setDate(d0.getDate() + 7) > d1;
}

alert(within7Days('12-3/2012', '18/3/2012')); // true
alert(within7Days('12-3/2012', '19/3/2012')); // false

如果日期可以在之前或之后,您可能需要使用Math.abs()

编辑

顺便说一句,不要信任Date.parse。在 ECMA-262 ed 3 中,它本质上是依赖于实现的。在 ES5 中,它被指定为首先尝试将字符串解析为 ISO8601,但之后,它与实现无关。 IE(至少

无论如何,手动解析日期是微不足道的。

【讨论】:

  • 通过使用 Date 对象的内部解析器,您可以确保使用与最终用户的语言环境相关的日期格式,而不是强制他们使用任何特定的格式类型(例如,我d 在 dd/mm/yyyy 之前输入 mm/dd/yyyy 或 dd-mmm-yyyy)
  • @DavidEllis——内置的日期解析器在浏览器之间不一致,日期iteslf不尊重输入的语言环境(你为什么要相信它),即使是toLocaleString,所以解析器应该不被使用。唯一安全的方法是指定格式、验证输入、解析并处理无效字符串。但这不是 OP 的一部分。 OP 声明日/月/年,上面支持“-”或“/”作为分隔符。
猜你喜欢
  • 2011-10-20
  • 2010-09-09
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多