Javascript:以 dd/mm/yyyy 格式检查将来的日期

Javascript: check date in future in dd/mm/yyyy format?

本文关键字:检查 将来 日期 格式 mm dd Javascript yyyy      更新时间:2023-09-26

我正在尝试检查用户输入字段以查看它是否在将来以及它是否为 dd/mm/yyyy 格式,但我不知道为什么我的代码的格式部分根本没有触发!事实上,Jsfiddle 似乎没有任何工作,但至少我的"将来检查日期"功能在本地工作。

我不知道正确的方法。

为了解释这一点,我创建了这个小提琴

这是我完整的JavaScript代码。顺便说一下,我需要保持纯JavaScript:

function checkdate(){
    //var sendDate = document.getElementById('send_year').value + '/' + document.getElementById('send_month').value + '/' + document.getElementById('send_day').value;
    var sendDate = document.getElementById('returning_date').value;



    sendDate = new Date(Date.parse(sendDate.replace(/-/g,' ')))
    today = new Date();
    today.setHours(0,0,0,0)
    if (sendDate < today) {
        //alert('The  date can''t be in the past. Please pick another date.');
        document.getElementById('error8').innerHTML = 'The  date can''t be in the past. Please pick another date.';
        return false;
    }
    else
{
   document.getElementById('error8').innerHTML = '';
}

if(sendDate.match(/^[0-9]{4}'-(0[1-9]|1[012])'-(0[1-9]|[12][0-9]|3[01])/))
{
  alert('works out');
}
}

有人可以就此问题提供建议吗?

提前谢谢。

一个问题是你试图运行sendDate.match,但sendDate已经转换为Date对象,所以它没有match方法。

您应该在将正则表达式转换为 Date 之前运行正则表达式,在验证中,您通常会在运行进一步验证(如范围验证)之前检查输入是否符合格式。

日期字符串应始终手动解析,永远不应允许 Date 构造函数或 Date.parse 解析字符串(Date 构造函数以与 Date.parse 完全相同的方式解析字符串)。

要解析和验证日期字符串相当简单,只需解析字符串并查看是否获得有效日期:

/* Parse a string in d/m/y format. Separator can be any non–digit
** Avoid conversion of two digit dates to 20th century
** Returns an invalid Date if string is not a valid date (per ECMA-262)
**
** @param {string} s - Date string to parse
** @returns {Date}
*/
function parseDMY(s) {
  var b = s.split(/'D/);
  var d = new Date();
  d.setHours(0,0,0,0);
  d.setFullYear(b[2], --b[1], b[0]);
  return d && d.getMonth() == b[1]? d : new Date(NaN);
}
// Test valid date
document.write(parseDMY('23/01/2016'));
// Test invalid date
document.write('<br>' + parseDMY('35/12/2016'));

请注意,这将接受类似 1/5/16 的日期,并将日期视为 0016 年 5 月 1 日。如果要保证日和月值具有两位数和年份,请添加:

/^'d'd'D'd'd'D'd{4}$/.test(s)

到最后的验证测试。但是,我不喜欢强制使用2位数字表示日期和月份,因为人们通常不会将日期写为"01/08/2016",而是使用"1/8/2016"。

首先,函数需要包装在 <head> 中(点击 js 选项卡中的齿轮),否则找不到函数。

但是您的主要问题是您使用的是欧洲风格的日期格式,因此在创建日期时会出现"无效日期"异常。有关如何将其转换为美国样式并使其可用于Date对象的信息,请参阅此问题(检查所有可能用途的参考)

我的建议是:

Date.prototype.fromString = function(str) {
  var m = str.match(/([0-9]{2})(-|'/)([0-9]{2})(-|'/)([0-9]{4})/);
  if (m == null) {
    return null;
  }
  for (var i = 0; i < m.length; i++) {
    if (typeof(m[i]) === 'undefined') {
      return null;
    };
  };
  var year = parseInt(m[5]);
  var month = parseInt(m[1]) - 1;
  var day = parseInt(m[3]);
  if (month == 0 || day == 0) {
    return null;
  }
  return new Date(year, month, day);
}

function checkdate(e, obj, errMsgSel){
  var sendDate =obj.value;
  sendDate = (new Date()).fromString(sendDate);
  if (sendDate == null) {
    if (e.type == 'blur') {
      obj.value = '';
    }
    return;
  }
  today = new Date();
  today.setHours(0,0,0,0)
  if (sendDate < today) {
    //alert('The  date can''t be in the past. Please pick another date.');
    document.getElementById(errMsgSel).innerHTML = 'The  date can''t be in the past. Please pick another date.';
    return false;
  }
  else
  {
    document.getElementById(errMsgSel).innerHTML = '';
  }
}        $(function () {
});
<input onblur="checkdate(event, this, 'error8');" onKeyUp="checkdate(event, this, 'error8');" type='text' name="text1" placeholder='dd/mm/yyyy' id='returning_date'>
<span id='error8' style='color:red;'>format</span> <br><Br>