§11. Удобный ввод даты

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

Я использую в своих проектах функцию, которая позволяет немного упростить жизнь обоим.

Например, можно использовать один из трех разделителей (точка, дефис или слеш) и даже вообще его не вводить. Или не вводить год и даже месяц (тогда автоматически будет использован текущий).

Вся красота ниже:

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(), вводя разные даты.

Введите дату как-нибудь
Ваша дата в строгом формате

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *