0

检查字段:

checkFields = function() {
  var colCheck = 0;
  var colArray = [];
  var colDupArray = [];
  var iDate = $("check_date").value;
  if(iDate.length > 0) {
    var a = iDate.split("/"); 
    if(isValidDate(a[0],a[1]-1,a[2]) == false){
      alert("You have entered an invalid date. Please amend!");
      return false;
    }

验证:

isValidDate = function(day,month,year) {
  var dteDate;
  dteDate=new Date(year,month,day);

  var day = dteDate.getDate();
  var month = dteDate.getMonth() + 1;
  var year = dteDate.getFullYear();

  var formatted =
      (day < 10 ? "0" : "") + day + "/"  +
      (month < 10 ? "0" : "") + month + "/"  +
      year;

  return
+day === dteDate.getDate() && 
+month === dteDate.getMonth() &&
+year === dteDate.getFullYear();
}

问题是我的代码正在接受诸如“03.06.2012”之类的日期,而我只希望它接受数字之间的斜线。

当我只想要一个四位数的年份时,它也接受“03/06/12”。

有任何想法吗?

4

3 回答 3

2

正如建议的那样,让用户以选择的格式输入日期。输出应该符合您的预期。

我用一个Date.prototype.formatDateField名为moment的库扩展了我的小演示,这似乎也很干净。作为第三个选项 jQuery-UI$.datepicker.formatDate()

但这仍然不是万无一失的,也许您应该寻找一个可以为您处理格式的日期选择器。恕我直言,您的问题的最佳解决方案。

但是,如果您想自定义,这可能会让您入门:

// prototype
Date.prototype.formatDateField = function (options) {
    var i = 0,
        date = [],
        len = date.push(this.getDate(), this.getMonth() + 1, this.getFullYear());

    for (; i < len; i += 1) {
        var chunk = date[i];
        date[i] = chunk < 10 ? options.pad + chunk : chunk;
    }

    return date.join(options.separator);
};

// Setup output
var cfg = {
    fieldDate: "#fieldDate",
    options: {
        pad: "0",
        format: "dd/MM/yyyy",
        separator: "/"
    }
};

// function to call
function reformatInput(){
    $(cfg.date).blur(function(){
        var moment = moment(this.value).calendar(cfg.options2.format),
            prot = new Date(this.value).formatDateField(cfg.options2),
            jqueryui = $.datepicker.formatDate(cfg.options2.format, new Date(this.value));

        $(cfg.fieldDate1).val(moment);
        $(cfg.fieldDate2).val(prot);
        $(cfg.fieldDate3).val(jqueryui);
    });
}

// run on demand
reformatInput();

演示:http: //jsfiddle.net/tive/YvdKA/

于 2013-05-01T16:37:34.030 回答
1

至少对于四位数年份问题,请查看此 jfiddle输出和代码:

d1 = new Date(1,2,3);
d2 = d1.getFullYear();
d3 = d1.getMonth();
d4 = d1.getDay();
alert(d2);
alert(d3);
alert(d4);

Date 构造函数对四年数字并不严格(尽管 Mozilla 说你应该这样做)。在上面的示例中,它甚至将 int 1 作为一年!这反映在您的程序接受长度不是 4 个字符的年份。

也许测试年份字符串的长度?

至于拆分,也许您可​​以使用既可以拆分可以确保只接受斜杠的正则表达式(如此处所建议

于 2013-05-01T15:00:40.617 回答
1

您以某种方式将格式与验证功能混合在一起。应该是这样的:

function isValidDate(day,month,year) {
    var dteDate = new Date(year,month,day);

    return +day === dteDate.getDate()
        && +month === dteDate.getMonth()
        && +year === dteDate.getFullYear();
}
function formatDate(dteDate) {
    var day = dteDate.getDate(),
        month = dteDate.getMonth() + 1,
        year = dteDate.getFullYear();

    var formatted = (day < 10 ? "0" : "") + day + "/"
                  + (month < 10 ? "0" : "") + month + "/"
                  + year;
    return formatted;
}
于 2013-05-01T18:53:51.913 回答