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

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

30.11.2012, 11:21. Показов 22932. Ответов 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
13441 / 7534 / 831
Регистрация: 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
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru