20.07.2016, 13:09
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,672
|
|
Сообщение от Master_Sergius
|
Я могу провести валидацию даты и времени согласно нужному мне формату.
|
Дата выводится то всё равно в стандартном виде, хоть какой формат указывай, чем отличается от стандартной ошибки тогда твоя валидация?
alert(new Date('01-01-2001'));
|
|
20.07.2016, 16:06
|
Аспирант
|
|
Регистрация: 29.07.2014
Сообщений: 42
|
|
Вот, решил таким образом:
function validate_date(date_str, date_format){
/* Validate date or datetime due to specified format
*
* Example: date_str "01/01/2016" valid with format "M/d/y",
* but invalid with format "M/d/y h:m:s"
*/
date_str = date_str.trim();
var letter = "", re = "";
// replace letters in format with regex digit "\d", thus 'd' must be first
replace_patterns = ['d', 'M', 'm', 'Y', 'y', 'H', 'h', 'm', 's']
for (i=0; i < replace_patterns.length; i++) {
pattern = replace_patterns[i];
re = new RegExp(pattern, 'g');
date_format = date_format.replace(re, '\\d');
}
var date_format_regex = new RegExp('^' + date_format + '$');
return (date_format_regex.test(date_str) && !isNaN(Date.parse(date_str)));
};
Единственная беда в том, что Date.parse() пропускает чуть ли не любое число для месяца и дня, к примеру:
>Date.parse('40/40/2015')
1525899600000
Ещё бы эту проблему решить как-то.
|
|
20.07.2016, 16:44
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,103
|
|
Сообщение от Master_Sergius
|
Ещё бы эту проблему решить как-то.
|
Сообщение от рони
|
из новой даты вытащить числа, сформировать строку и сравнить с прежней строкой ... как-то так
|
|
|
20.07.2016, 16:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,103
|
|
Master_Sergius,
вам какой формат нужен?
|
|
20.07.2016, 17:22
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,103
|
|
валидация даты
Master_Sergius,
function validate_date(date) {
var str = date.trim().split("/");
if (str.length == 3) {
str = new Date(str[2], str[0] - 1, str[1], 0, 0, 0);
if (!str) return false;
str = [("0" + (str.getMonth() + 1)).substr(-2), ("0" + str.getDate()).substr(-2), str.getFullYear()].join("/");
return str === date.trim()
}
return false
};
alert(validate_date('01/21/2015')); //true mm/dd/yyyy
alert(validate_date('40/40/2015')); // false
|
|
20.07.2016, 17:37
|
Аспирант
|
|
Регистрация: 29.07.2014
Сообщений: 42
|
|
Сообщение от рони
|
Master_Sergius,
function validate_date(date) {
var str = date.trim().split("/");
if (str.length == 3) {
str = new Date(str[2], str[0] - 1, str[1], 0, 0, 0);
if (!str) return false;
str = [("0" + (str.getMonth() + 1)).substr(-2), ("0" + str.getDate()).substr(-2), str.getFullYear()].join("/");
return str === date.trim()
}
return false
};
alert(validate_date('01/21/2015')); //true mm/dd/yyyy
alert(validate_date('40/40/2015')); // false
|
Неплохой вариант! Я ещё такую штуку рассматриваю:
^(([0]?[1-9]|1[0-2])/([0-2]?[0-9]|3[0-1])/[1-2]\d{3}) (20|21|22|23|[0-1]?\d{1}):([0-5]?\d{1})$
В общем, суть понял. Спасибо.
|
|
20.07.2016, 18:30
|
Аспирант
|
|
Регистрация: 29.07.2014
Сообщений: 42
|
|
Сообщение от рони
|
Master_Sergius,
function validate_date(date) {
var str = date.trim().split("/");
if (str.length == 3) {
str = new Date(str[2], str[0] - 1, str[1], 0, 0, 0);
if (!str) return false;
str = [("0" + (str.getMonth() + 1)).substr(-2), ("0" + str.getDate()).substr(-2), str.getFullYear()].join("/");
return str === date.trim()
}
return false
};
alert(validate_date('01/21/2015')); //true mm/dd/yyyy
alert(validate_date('40/40/2015')); // false
|
Вот это меня натолкнуло на такую мысль и теперь вроде всё работает (до идеала ещё далеко, но всё же):
function validate_date(date_str, date_format){
/* Validate date or datetime due to specified format
*
* Example: date_str "01/01/2016" valid with format "MM/dd/YYYY",
* but invalid with format "MM/dd/YYYY hh:mm:ss"
*
* NOTE: MM/dd/YYYY and M/d/Y are equivalent, hh:mm:ss equals to h:m:s
*/
date_str = date_str.trim();
var date_parsed = Date.parse(date_str);
if (!isNaN(date_parsed)) {
date_parsed = new Date(date_parsed);
} else {
return false;
}
// build date from components according to format
date_format = date_format.replace(/M+/g, ("0" + (date_parsed.getMonth() + 1)).substr(-2));
date_format = date_format.replace(/d+/g, ("0" + date_parsed.getDate()).substr(-2));
date_format = date_format.replace(/Y+/g, date_parsed.getFullYear());
date_format = date_format.replace(/h+/g, ("0" + date_parsed.getHours()).substr(-2));
date_format = date_format.replace(/m+/g, ("0" + date_parsed.getMinutes()).substr(-2));
date_format = date_format.replace(/s+/g, ("0" + date_parsed.getSeconds()).substr(-2));
console.log(date_parsed);
console.log(date_format);
return date_str == date_format
};
alert(validate_date('02/30/2016', 'MM/dd/YYYY'));
alert(validate_date('02/28/2016', 'MM/dd/YYYY'));
Последний раз редактировалось Master_Sergius, 21.07.2016 в 11:14.
Причина: добавка алертов для запуска
|
|
20.07.2016, 19:21
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,672
|
|
Master_Sergius, количество дней в месяцах разное... тоже надо валидировать раз на то пошло, а то получится 30 февраля валидной датой...
|
|
20.07.2016, 19:35
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,103
|
|
Сообщение от Rise
|
а то получится 30 февраля валидной датой...
|
не получится, можешь проверить
|
|
20.07.2016, 19:38
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,672
|
|
рони, на котором проверять, его последний пример пропускает переполненные даты я его вообще не рассматриваю?
|
|
|
|