Валидация даты/время без библиотеки Date.js
Здравствуйте! Вот, что умеет библиотека Date.js http://www.datejs.com/:
> Date.parseExact('01-01-2001', "MM-dd-yyyy") Mon Jan 01 2001 00:00:00 GMT+0200 (EET) > Date.parseExact('01-01-2001', "MM-dd-yyyy HH:mm:ss") null > Date.parseExact('01-01-2001 12:12:12', "MM-dd-yyyy HH:mm:ss") Mon Jan 01 2001 12:12:12 GMT+0200 (EET) То есть, Я могу провести валидацию даты и времени согласно нужному мне формату. Как добиться такого же результата без использования сторонних библиотек? Ну и конечно же не подходит вариант - скопировать код этой библиотеки себе в скрипт :) |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Вот, решил таким образом:
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 Ещё бы эту проблему решить как-то. |
Цитата:
Цитата:
|
Master_Sergius,
вам какой формат нужен? |
валидация даты
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})$ В общем, суть понял. Спасибо. |
Цитата:
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')); |
Цитата:
|
Rise,
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('02/30/2015')); //false mm/dd/yyyy alert(validate_date('02/28/2015')); //true mm/dd/yyyy |
Цитата:
|
Валидация даты
Rise,
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); alert(str) 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('02/дд/2015')); // mm/dd/yyyy |
Валидация даты
Rise,
уговорил :) дополненный вариант 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 == 'Invalid Date') 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('02/дд/2015')); //false mm/dd/yyyy alert(validate_date('02/30/2015')); //false mm/dd/yyyy alert(validate_date('02/29/2016')); //true mm/dd/yyyy |
Rise,
спасибо за науку!!! плюсануть не могу |
Я добавил алерты и кнопочку запустить, прошу проверить.
|
Часовой пояс GMT +3, время: 17:33. |