Как проверить ввод в читаемом формате даты с использованием JavaScript - PullRequest
0 голосов
/ 02 ноября 2019

Можно ли проверить обычный текстовый ввод в читаемом формате даты, например, 25 ноября 2019 года? Это потому, что я использую средство выбора даты в javascript, однако пользователь все еще может вводить все, что хочет.

Я предполагаю, что это можно сделать, используя какое-то регулярное выражение, но задаюсь вопросом, есть ли другая функция или решение?

Я думаю, вы могли бы разделить это на 3 части, первая часть должна была бы быть написана 1 из 12 месяцев, в то время как день должен был бы быть 1 из 31, за которым следовала бы запятая, а затем год должен был быподтвердите что-то среднее между 1000 и 9999.

Пока это то, куда я направляюсь

var dateval = $('#' + formId + ' input[name=date]').val();
var res = dateval.split(" ",3);
var d1 = res[0];
var d2 = res[1];
var d3 = res[2];

var montharray = ['Januaray','February'];
var dayarray = ['1,','2,'];

if($.inArray(d1,montharray) !== -1){
    alert('good month');
}       
if($.inArray(d2,dayarray) !== -1){
    alert('good day');
}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Вы можете легко проверять и интерпретировать даты, если вы сообщаете пользователю свой формат. Вам не нужен список дней или лет, просто список сокращений и длин месяцев:

var d;

function val() {
  var s = document.getElementById("i").value;
  s = s.trim(); //Remove some fustration:
  s = s.replace(/[.,/\-]/g," ");
  s = s.replace(/\s\s+/g, ' '); 
  var a = s.split(" ");  
  var day = Number(a[1]);
  var smonth = a[0].substr(0,3).toLowerCase();
  var month = 13;
  for (var i = 0; i < 12; i++) {
    if (smonth == Months[i].name) {
      month = i;
      break;
    }
  }
  year = Number(a[2]);
  if (isBtwn(month, 0, 11) && isBtwn(year, 1900, 2100) && isBtwn(day, 1, monthL(month, year))) {
    d = new Date(Number(year), Number(month), Number(day));
    document.getElementById("o").innerHTML = "Valid: " + d.toDateString();
  } else document.getElementById("o").innerHTML = "Not valid";
}

function isBtwn(val, min, max) {
  if (val >= min && val <= max) return true;
}

function monthL(m,y) {
  l = Months[m].length;
  if (m == 1) {
    if (y % 400 == 0) l++;
    else if (y % 4 == 0 && y % 100 != 0) l++;
  }
  return l;
}

var Months = [{
    name: "jan",
    length: 31
  },
  {
    name: "feb",
    length: 28
  },
  {
    name: "mar",
    length: 31
  },
  {
    name: "apr",
    length: 30
  },
  {
    name: "may",
    length: 31
  },
  {
    name: "jun",
    length: 30
  },
  {
    name: "jul",
    length: 31
  },
  {
    name: "aug",
    length: 31
  },
  {
    name: "sep",
    length: 30
  },
  {
    name: "oct",
    length: 31
  },
  {
    name: "nov",
    length: 30
  },
  {
    name: "dec",
    length: 31
  }
]
<p>Use format <code>Month DD YYYY:</code></p>
<input id="i" oninput="val()" />
<div id="o"></div>

Если вы можете преобразовать строку в дату, вы подтвердили ее. (Вы также можете отправить данные в виде трех чисел, а не в виде строки). Есть несколько вещей, которые следует учитывать при создании конвертера такого типа, например:

  • Трудно печатать целый месяц, и если есть орфографические ошибки, это может расстроить. Для проверки первых трех символов достаточно использовать .substr(0,3) месяца.
  • Необходимо включить високосные годы (дополнительный день в феврале каждые 4 года, но не 100 лет, а каждые 400 лет).
  • Он не должен быть чувствительным к регистру для удобства, чего можно добиться с помощью команды .toLowerCase()
  • Использование .replace(/[.,/\-]/g," ") преобразует некоторые символы, используемые для пробела дня, месяца и года, с одинаковыми пробелами, улучшаясовместимость
  • Использование .replace(/\s\s+/g, ' ') удаляет последовательные пробелы, повышая его устойчивость к простым опечаткам.

Возможно иметь несколько форматов;просто иметь несколько валидаторов, каждый из которых предназначен для своего формата, в последовательности.

0 голосов
/ 02 ноября 2019

Дата будет подтверждена в этом формате День полных месяцев, ГГГГ

function validate_date(dateval){

    var valid = true;
    var res = dateval.split(" ",3);
    var d1 = res[0];
    var d2 = res[1];
    var d3 = res[2];

    var montharray = ['Januaray','February','March','April','May','June','July','August','September','October','November','December'];
    var dayarray = ['1,','2,','3,','4,','5,','6,','7,','8,','9,','10,','11,','12,','13,','14,','15,','16,','17,','18,','19,','20,','21,','22,','23,','24,','25,','26,','27,','28,','29,','30,','31,'];
    var leapyears = ['2020','2024','2028','2032','2036','2040','2044','2048','2052','2056','2060','2064','2068','2072','2076','2080','2084','2088','2092','2096'];

    if($.inArray(d1,montharray) === -1){
        valid = false;
    }   
    if($.inArray(d2,dayarray) === -1){
        valid = false;
    }
    if(d3 < 1000 || d3 > 9999){
        valid = false;
    }
    if(d1 == 'February' && d2 == '30,'){
        valid = false;
    }
    if(d1 == 'February' && d2 == '31,'){
        valid = false;
    }
    if(d1 == 'April' && d2 == '31,'){
        valid = false;
    }
    if(d1 == 'June' && d2 == '31,'){
        valid = false;
    }
    if(d1 == 'September' && d2 == '31,'){
        valid = false;
    }
    if(d1 == 'November' && d2 == '31,'){
        valid = false;
    }
    if(d1 == 'February' && d2 == '29,'){
        if($.inArray(d3,leapyears) === -1){
            valid = false;
        }
    }
    return valid;
}
0 голосов
/ 02 ноября 2019

почему бы и нет, когда пользователь потерял фокус из палитры дат, запустит событие, которое будет принимать пользовательский ввод даты и делать следующее -

var dateEntered = // add the date entered by the user 

var date = new Date(dateEntered); // this will make sure to convert the date entered by the user into a valid date

, если это неправильная дата, тогда дата будетесть ошибка, я надеюсь, что вы можете понять это

я надеюсь, что это поможет

...