Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/124: Рейтинг темы: голосов - 124, средняя оценка - 4.62
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315

Валидация даты

30.11.2012, 11:21. Показов 22762. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста: как проверить на правильность введенную пользователем дату? формат "д.м.г" варианты с регуляркой не подойдут однозначно, вариант с разбивкой по точкам подходит, но как проверить правильность даты?

Код на подобие такого:
JavaScript
1
2
3
4
5
6
7
8
9
10
function isValidDate(val)
{
  var val_r = val.split(".");
  var curDate = new Date(val_r[2], val_r[1], val_r[0]);
  return (
    curDate.getFullYear() == val_r[2]
    && curDate.getMonth() == val_r[1]
    && curDate.getDate() == val_r[0]
  );
}
не подойдет, потому что если конструктору передать 32,12,2013 то он отреагирует нормально и создаст дату 01.01.2014

Добавлено через 4 минуты
нашел где-то вот такое чудо:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function isValidDate(str, daysFirst){
        
      var re = /^(\d{1,2})[\s\.\/-](\d{1,2})[\s\.\/-](\d{4})$/
      if (!re.test(str)) return false;
      var result = str.match(re);
      var m = parseInt(result[1],10);
      var d = parseInt(result[2],10);
      if (daysFirst) {
      //if dd/mm/yyyy
        d = parseInt(result[1],10);
        m = parseInt(result[2],10);
      }
      var y = parseInt(result[3],10);
      if (m < 1 || m > 12 || y < 1900 || y > 2100) return false;
      if (m == 2){
              var days = ((y % 4) == 0) ? 29 : 28;
      } else if(m == 4 || m == 6 || m == 9 || m == 11){
              var days = 30;
      } else{
              var days = 31;
      }
      return (d >= 1 && d <= days);
  }
Есть более человечные варианты?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2012, 11:21
Ответы с готовыми решениями:

Валидация даты
Мальчики, кто знает как решить? Очень сложно. Никто пока не справился(( есть число 20130416 (формат string) как сделать валидацию на...

Валидация кода
Всем доброй ночи! Сегодня решил сделать полную валидность дизайна своего, но при проверке написало 52 Свойство opacity не существует...

Не работает валидация
Здравствуйте, уважаемые форумчане!!! Возникла проблема с валидацией данных(точнее не выводятся ошибки на пустые поля) Есть...

32
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 11:46
для формата дд.мм.гггг
1) проверяем, чтобы было 8 цифр и две точки
2) сплитуем по точкам
3) устанавливаем время
4) "вытаскиваем" день, месяц и год
5) "собираем" их в строку через точки (добавляя нули спереди по необходимости)
6) сравниваем с исходной строкой
JavaScript
1
2
3
4
5
6
7
8
9
function isValidDate (str)
{
if (!/^\d\d\.\d\d\.\d{4}$/.test (str)) {alert ('Error, unformat'); return}
var a0 = function (x) {return ((x < 10) ? '0' : '') + x},
t = str.split ('.'), ndt = new Date (+t [2], t[1] - 1, +t [0]);
with (ndt) var tst = [a0 (getDate ()), a0 (getMonth () + 1), getFullYear ()].join ('.');
if (tst != str) {alert ('Error, non-existent date'); return}
// OK!
}
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
30.11.2012, 11:52  [ТС]
угу, а что будет, если пользователь введет 32.12.2013?) получится 01.01.2014
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 12:13
23Alex24, а вы попробуйте
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function isValidDate (str)
{
if (!/^\d\d\.\d\d\.\d{4}$/.test (str)) {alert ('Error, unformat'); return}
var a0 = function (x) {return ((x < 10) ? '0' : '') + x},
t = str.split ('.'), ndt = new Date (+t [2], t[1] - 1, +t [0]);
with (ndt) var tst = [a0 (getDate ()), a0 (getMonth () + 1), getFullYear ()].join ('.');
if (tst != str) {alert ('Error, non-existent date'); return}
// OK!
}
 
isValidDate ('32.12.2013');
функция даст ответ - 'Error, non-existent date', что переводится как "Ошибка, несуществующая дата"
и именно потому, что 32.12.2013 != 01.01.2014
----------

вы вообще хоть попытались понять то, что я выше написал аж в целых шести пунктах?
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 829
Регистрация: 09.09.2009
Сообщений: 29,554
30.11.2012, 12:27
задействуйте для ввода юзером даты например вот этот скрипт
http://www.rainforestnet.com/d... picker.htm
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 13:01
Dmitry, моя функция полностью удовлетворяет исходному запросу

только вот я просто написал //OK! последней строкой, полагая, что топикстартер САМ пропишет там то, что ему надо при валидной дате
но он, видимо, этого не понял

ау, замените //ОК! на alert ('Всё хорошо, прекрасная маркиза! Всё хорошо, всё хорошо!');
0
30.11.2012, 13:05

Не по теме:

в данном случае, имхо, есть два радикально противоположных способа.
первый - разрешить юзеру ввести в поле все, что угодно, а потом проверять - а то ли он навводил.
и второй - дать юзеру форму, в которой уже весь возможный выбор ограничен только валидными значениями, и никакой "отсебятины" юзер ввести не может просто физически...

на мой лично взгляд, второй способ как раз больше подходит под определение "защита от дурака".

0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 13:12
Dmitry, согласен

однако в топике написано "как проверить на правильность введенную пользователем дату?"
и я отвечал на поставленный вопрос
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
30.11.2012, 13:19  [ТС]
Чудеса, с трудом разобравшись что вы делаете, я наконец понял)) честно говоря выглядит дико, так к слову формат был "д.м.г.", не надо было нули добавлять, ну не суть конечно, да бесспорно оно будет работать,но мне казалось есть более правильный подход))

Добавлено через 1 минуту
Хотя возможно без нулей как раз данный способ и не сработал бы=) ну думаю тогда бы вы сравнили отдельно каждое значение числа, месяца и года)
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 13:24
23Alex24, формата д.м.г быть не может
1.1.4 - это какой год? 1004? 2004? или 2014?
как минимум формат должен быть д.м.гггг

вам надо под этот формат?
чтобы проверял и 1.1.2013, и 1.12.2013, и 30.6.2011, и 25.11.2009 ?

нет проблем - уберите определение функции a0 и два её вызова:
JavaScript
1
2
3
4
5
6
7
8
function isValidDate (str)
{
if (!/^\d\d\.\d\d\.\d{4}$/.test (str)) {alert ('Error, unformat'); return}
var t = str.split ('.'), ndt = new Date (+t [2], t[1] - 1, +t [0]);
with (ndt) var tst = [getDate (), getMonth () + 1, getFullYear ()].join ('.');
if (tst != str) {alert ('Error, non-existent date'); return}
alert ('Всё хорошо, прекрасная маркиза! Всё хорошо, всё хорошо!');
}
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
30.11.2012, 13:29  [ТС]
под "д.м.г" я понимаю формат "d[d].m[m].y[yyy]" чтоб мозги пользователю не парить, пусть как хочет так и вводит, хочет 01.01.0001, хочет 1.1.1, хочет 01.01.201 ну и т.д.) просто убрать вызов функции а не поможет, если пользователь ввдеет 8.8.2012, то сравнится с 08.08.2012 и выдаст ошибку) там придется именно сравнивать по значениям даты, месяца, года)
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 13:30
Цитата Сообщение от 23Alex24 Посмотреть сообщение
под "д.м.г" я понимаю формат "d[d].m[m].y[yyy]" чтоб мозги пользователю не парить, пусть как хочет так и вводит, хочет 01.01.0001, хочет 1.1.1, хочет 01.01.201 ну и т.д.)
ну, извините, тогда САМИ разбирайтесь
как проверить валидность даты, если ГОД этой даты не определён?
в каком-то "нулевом" году есть 29 февраля, а в каком-то - нет этого числа
ну и как проверить валидность?

--------
в предыдущем коде я забыл проверку регуляркой изменить
if (!/^\d{1,2}\.\d{1,2}\.\d{4}$/.test (str)) {alert ('Error, unformat'); return}
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
30.11.2012, 13:47  [ТС]
ну вот именно, что придется проверять как-то не по хорошему, на основании увиденных вариантов получилось что-то на подобие этого:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function dateIsValid( userValue )
  {
     var regexp = /^\d{1,2}\.\d{1,2}\.\d{1,4}$/;
     if ( regexp.test( userValue ) )
     {
        var values = userValue.split( '.' );
        var d = values[0] - 0;
        var m = values[1] - 0;
        var y = values[2] - 0;
        var daysInMonth = 0;
 
        if ( m < 1 || m > 12 || y < 1 || y > 9999 ) return false
        else
        {
           if ( m == 2 )
           {
              daysInMonth = ( ( y % 4 ) == 0 ) ? 29 : 28;
           }
           else if ( m == 4 || m == 6 || m == 9 || m == 11 )
           {
              daysInMonth = 30;
           }
           else daysInMonth = 31;
           return ( d <= daysInMonth );
        }
     }
     else return false;
  }
конечно тут можно это все дело наверно оптимизировать еще, убавить кода, что-то в регулярке сразу проверить, мне тож не нравится этот способ)
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 13:52
Цитата Сообщение от 23Alex24 Посмотреть сообщение
if ( m == 2 ) { daysInMonth = ( ( y % 4 ) == 0 ) ? 29 : 28; }
- это для юлианского календаря
а мы живём по григорианскому, где не каждый четвёртый год является високосным
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
30.11.2012, 13:58  [ТС]
эм, вы ничего не путаете? посмотрите в календарь на компе, там каждые 4 года же так...?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.11.2012, 14:09
нет, я ничего не путаю
Отсюда следует распределение високосных годов:
год, номер которого кратен 400 — високосный;
остальные годы — год, номер которого кратен 100 — не високосный;
остальные годы — год, номер которого кратен 4 — високосный.
Таким образом, 1600 и 2000 годы были високосными, а 1700, 1800 и 1900 годы високосными не были.
(с) http://ru.wikipedia.org/wiki/%... 1%80%D1%8C
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
30.11.2012, 14:22  [ТС]
Очень интересно, не знал, надо будет подогнать и под эти ситуации=)

Добавлено через 10 минут
Ну тогда метод будет таким:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function dateIsValid( userValue )
  {
     var regexp = /^\d{1,2}\.\d{1,2}\.\d{1,4}$/;
     if ( regexp.test( userValue ) )
     {
        var values = userValue.split( '.' );
        var d = values[0] - 0;
        var m = values[1] - 0;
        var y = values[2] - 0;
        var daysInMonth = 0;
 
        if ( m < 1 || m > 12 || y < 1 || y > 9999 ) return false
        else
        {
           if ( m == 2 )
           {
              daysInMonth = ( ( y % 400 ) == 0 ) ? 29 : ( ( y % 100 ) == 0 ) ? 28 : ( ( y % 4 ) == 0 ) ? 29 : 28;
           }
           else if ( m == 4 || m == 6 || m == 9 || m == 11 )
           {
              daysInMonth = 30;
           }
           else daysInMonth = 31;
           return ( d <= daysInMonth );
        }
     }
     else return false;
  }
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
03.12.2012, 11:23  [ТС]
Чуть чуть оптимизировал:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function dateIsValid(userValue)
  {
    var regexp = /^\d{1,2}\.\d{1,2}\.\d{1,4}$/;
    if (regexp.test(userValue))
    {
      var values = userValue.split('.');
      var d = values[0] - 0;
      var m = values[1] - 0;
      var y = values[2] - 0;
      var daysInMonth = 31;
 
      if (m > 0 && m < 13 && y > 0 && y < 10000)
      {
        if (m == 2)
        {
          daysInMonth = ((y % 400) == 0) ? 29 : ((y % 100) == 0) ? 28 : ((y % 4) == 0) ? 29 : 28;
        }
        else if (m == 4 || m == 6 || m == 9 || m == 11)
        {
          daysInMonth = 30;
        }
        return (d <= daysInMonth);
      }
      return false;
  }
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.12.2012, 11:56
не-а, мой скрипт всё-равно "более лучший"
JavaScript
1
2
3
4
5
6
7
8
9
function isValidDate (str)
{
if (!/^\d{1,2}\.\d{1,2}\.\d{1,4}$/.test (str)) return false;
var t = str.split ('.'), p = function (x) {return parseInt (x)}
t [0] = p (t [0]), t [1] = p (t [1] - 1), t [2] = p (t [2]);
with (new Date (t [2], t [1], t [0])) if (t.join ('.') !=
[getDate (), getMonth (), getFullYear ()].join ('.'))
return false; return true;
}
короче и симпатиШнее
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
03.12.2012, 12:03  [ТС]
С опечатками=)) вот норм вариант:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function DateIsValid(userValue)
  {
    var regexp = /^\d{1,2}\.\d{1,2}\.\d{1,4}$/;
    if (regexp.test(userValue))
    {
      var values = userValue.split('.');
      var d = values[0] - 0;
      var m = values[1] - 0;
      var y = values[2] - 0;
      var daysInMonth = 31;
 
      if (m > 0 && m < 13 && y > 0 && y < 10000)
      {
        if (m == 2)
        {
          daysInMonth = ((y % 400) == 0) ? 29 : ((y % 100) == 0) ? 28 : ((y % 4) == 0) ? 29 : 28;
        }
        else if (m == 4 || m == 6 || m == 9 || m == 11)
        {
          daysInMonth = 30;
        }
        return (d <= daysInMonth);
      }
    }
    return false;
  }

На счет вашего решения:
1)Видимо читабельность кода вас вообще не волнует?)
2)вы вызываете парс инт только для того, чтобы ваш метод сработал, хотя проверив регуляркой мы уже уверены, что у нас там цифры и все ок=)
3)Ваш метод я бы переписал так:
JavaScript
1
2
3
4
5
6
7
8
function isValidDate (str)
{
if (/^\d{1,2}\.\d{1,2}\.\d{1,4}$/.test (str))
{var t = str.split ('.'), p = function (x) {return parseInt (x)}
t [0] = p (t [0]), t [1] = p (t [1] - 1), t [2] = p (t [2]);
with (new Date (t [2], t [1], t [0])) if (t.join ('.') ==
[getDate (), getMonth (), getFullYear ()].join ('.'))
return true; }return false;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2012, 12:03
Помогаю со студенческими работами здесь

Валидация формы
Здравствуйте. У меня есть простая форма с двумя полями. Если поля не заполнены, то форма отправляться не должна. Сделал это вот так: ...

Json и валидация
Почему то выдает ошибку объясните пожалуйста var result = '{&quot;startTime&quot;:&quot;&lt;div class=\&quot;marginT20...

Валидация формы
Здравствуйте! Имеется скрипт при заполнении формы с полями ( имя, телефон, адрес). Если какое либо поле не заполнено или заполнено не...

Валидация формы
всем доброго времени суток. столкнулся с такой проблемой - нужно проверить на валидность данные, введенные пользователем. необходимо...

Валидация формы
Здравствуйте в JS есть два условия - если радиобаттон не выбран, то форма не отправляется и выводится текст с ошибкой. Но если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru