Ввод даты всегда доставляет неудобства как пользователю, так и программисту.
Я использую в своих проектах функцию, которая позволяет немного упростить жизнь обоим.
Например, можно использовать один из трех разделителей (точка, дефис или слеш) и даже вообще его не вводить. Или не вводить год и даже месяц (тогда автоматически будет использован текущий).
Вся красота ниже:
String.prototype.correctDateStr=function()
// пытается представить строку в виде даты DD.MM.YYYY
// если не получилось, возвращает исходную строку
{
// без разделителей
var r1=/^(\d{1,2})$/; // D(D)
var r2=/^(\d{2})(\d{1,2})$/; // DDM(M)
var r3=/^(\d{2})(\d{2})(\d{2})$/; // DDMMYY
var r4=/^(\d{2})(\d{2})(\d{4})$/; // DDMMYYYY
// с разделителями
var r11=/^(\d{1,2})[\.\-\/](\d{1,2})$/; // D(D).M(M)
var r12=/^(\d{1,2})[\.\-\/](\d{1,2})[\.\-\/](\d{2})$/; // D(D).M(M).YY
var r13=/^(\d{1,2})[\.\-\/](\d{1,2})[\.\-\/](\d{4})$/; // D(D).M(M).YYYY
// если строка не удовлетворяет ни одному из форматов, возвратим саму строку
if (!r1.test(this))
if (!r2.test(this))
if (!r3.test(this))
if (!r4.test(this))
if (!r11.test(this))
if (!r12.test(this))
if (!r13.test(this))
return this;
var test=new Date();
var d=RegExp.$1*1;
var m=(RegExp.$2=='')?(test.getMonth()+1):(RegExp.$2*1);
var y=(RegExp.$3=='')?(test.getFullYear()):(RegExp.$3*1);
// добавляем недостающие цифры к году
if (RegExp.$3.length==2)
{
y+=test.getFullYear()-test.getFullYear()%100;
if (y>test.getFullYear()+20) y-=100;
}
// проверяем получившуюся дату на правильность
test=new Date(y,m-1,d);
if (test.getFullYear()==y && test.getMonth()==m-1 && test.getDate()==d)
{
return ((d<10)?('0'+d):(d))+'.'+((m<10)?('0'+m):(m))+'.'+y;
}
else
return this;
}
Ниже можно протестировать работу метода String.correctDateStr(), вводя разные даты.
Введите дату как-нибудь
Ваша дата в строгом формате