Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2016, 12:13
Аспирант
Отправить личное сообщение для Master_Sergius Посмотреть профиль Найти все сообщения от Master_Sergius
 
Регистрация: 29.07.2014
Сообщений: 42

Валидация даты/время без библиотеки 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)


То есть, Я могу провести валидацию даты и времени согласно нужному мне формату. Как добиться такого же результата без использования сторонних библиотек? Ну и конечно же не подходит вариант - скопировать код этой библиотеки себе в скрипт
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2016, 12:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,135

Сообщение от Rise
почему во втором случае null
а что должно быть если данные не соотвествуют формату
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2016, 12:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,135

Сообщение от Master_Sergius
. Как добиться такого же результата без использования сторонних библиотек?
парсить строку и проверять
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2016, 12:56
Аспирант
Отправить личное сообщение для Master_Sergius Посмотреть профиль Найти все сообщения от Master_Sergius
 
Регистрация: 29.07.2014
Сообщений: 42

Сообщение от Rise Посмотреть сообщение
рони, а визуально не видно что не соответствуют формату зачем для этого библиотеку писать?
Ага, зачем же тогда вообще понапридумывали кучу алгоритмов, если всё видно визуально?

Сообщение от рони
парсить строку и проверять
Да, похоже как-то придётся парсить, но как? Разбить на числа и пробовать создать новый объект Date?
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2016, 12:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,135

Сообщение от Rise
визуально не видно
не осилил ... это типа а нафига валидация в js?
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2016, 13:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,135

Сообщение от Master_Sergius
Разбить на числа и пробовать создать новый объект Date?
из новой даты вытащить числа, сформировать строку и сравнить с прежней строкой ... как-то так
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2016, 13:05
Аспирант
Отправить личное сообщение для Master_Sergius Посмотреть профиль Найти все сообщения от Master_Sergius
 
Регистрация: 29.07.2014
Сообщений: 42

Сообщение от Rise Посмотреть сообщение
Master_Sergius, ну и для чего это надо приведи пример?
Обычно, максимум валидации пытаются сделать на стороне клиента, чтобы не грузить сервер и сеть. Представьте, что запросы/ответы могут быть реально очень тяжеловесные.
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2016, 16:06
Аспирант
Отправить личное сообщение для Master_Sergius Посмотреть профиль Найти все сообщения от Master_Sergius
 
Регистрация: 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


Ещё бы эту проблему решить как-то.
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2016, 16:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,135

Сообщение от Master_Sergius
Ещё бы эту проблему решить как-то.
Сообщение от рони
из новой даты вытащить числа, сформировать строку и сравнить с прежней строкой ... как-то так
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2016, 16:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,135

Master_Sergius,
вам какой формат нужен?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск