16.01.2012, 14:51
|
Новичок на форуме
|
|
Регистрация: 02.12.2011
Сообщений: 4
|
|
regexp формат даты
нужно проверить соответсвие строки формату даты.
формат даты - одна или две буквы d(день), одна или две m(месяц), две или четыре буквы y(год). порядок не важен. день, месяц и год разделены одинаковыми разделителями.
пример, 'dd-mm-yyyy', 'd/m/yy', 'yy.mm.dd'. не должно подходить 'd-d-yy', 'yyyy-mm-m'
на данный момент есть такой код
'dd-mm-yyyy'.match(/^(d{1,2}|m{1,2}|y{4}|y{2})([^a-zA-Z0-9]+)(d{1,2}|m{1,2}|y{4}|y{2})\2(d{1,2}|m{1,2}|y{4}|y{2})$/)
самый главный вопрос, можно ли проверить, чтобы нельзя было повторить день, месяц или год (например так 'd-d-yy')
и можно ли заменить y{4}|y{2} одним выражением (y{2,4} не подходит)
|
|
16.01.2012, 15:09
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от eca
|
формат даты - одна или две буквы d(день), одна или две m(месяц), две или четыре буквы y(год). порядок не важен. день, месяц и год разделены одинаковыми разделителями.
|
10-11-12
01/02/03
Что это за даты, согласно вашего алгоритма?
|
|
16.01.2012, 15:20
|
Новичок на форуме
|
|
Регистрация: 02.12.2011
Сообщений: 4
|
|
Сообщение от Gvozd
|
10-11-12
01/02/03
Что это за даты, согласно вашего алгоритма?
|
что это за дата зависит от формата, если формат например 'dd-mm-yy', то это 10 ноября 2012г
|
|
16.01.2012, 16:45
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Мне кажется регой дату не проверить. Придется разбирать по частям. И проверять по числам. Например: 29.02.2012
1. бьем по точкам (в данном случае)
2. проверяем год >= 1900 <= 2200 (для примера)
3. месяц >= 1 <=12 (в зависимости от года 29 фев.)
4. день в зависимости от месяца
Или попробовать мухлевать с объектом Date, в частности с Date.parse.
Или (не знаю, насколько правильно это рассуждение), действовать (через ж) так:
var w = "12.12.2012".split(".");
var x = new Date();
x.setFullYear(w[2]);
x.setMonth(w[1]);
x.setDate(w[0]);
//затем получать дату
if (x.getDate() + ".(Ваш разделитель)" + x.getMonth() + "." + x.FullYear() == w.join("."));
но получается какой-то велосипед.) Писал прям форум, ес че звиняйте ^_^
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 16.01.2012 в 17:00.
|
|
16.01.2012, 17:12
|
Новичок на форуме
|
|
Регистрация: 02.12.2011
Сообщений: 4
|
|
Сообщение от nerv_
|
Мне кажется регой дату не проверить. Придется разбирать по частям. И проверять по числам. Например: 29.02.2012
1. бьем по точкам (в данном случае)
2. проверяем год >= 1900 <= 2200 (для примера)
3. месяц >= 1 <=12 (в зависимости от года 29 фев.)
4. день в зависимости от месяца
Или попробовать мухлевать с объектом Date, в частности с Date.parse.
Или (не знаю, насколько правильно это рассуждение), действовать (через ж) так:
1 var w = "12.12.2012".split(".");
2 var x = new Date();
3 x.setFullYear(w[2]);
4 x.setMonth(w[1]);
5 x.setDate(w[0]);
6
7 //затем получать дату
8 if (x.getDate() + ".(Ваш разделитель)" + x.getMonth() + "." + x.FullYear() == w.join("."));
но получается какой-то велосипед.) Писал прям форум, ес че звиняйте ^_^
|
вы видимо не правильно поняли вопрос. мне нужно проверить соответствие строки именно формату даты, а не самой дате.
Сообщение от eca
|
нужно проверить соответсвие строки формату даты.
формат даты - одна или две буквы d(день), одна или две m(месяц), две или четыре буквы y(год). порядок не важен. день, месяц и год разделены одинаковыми разделителями.
|
например, в плагине календаря есть настройка, принимающая этот формат, т.е. сначала задаётся формат даты, а затем даты на сайте выводятся в соответствии с этим форматом. в настройках задаём формат 'yyyy-mm-dd', на сайте даты будут выводится в соответствии с этим форматом, т.е. '2012-01-16'.
|
|
18.01.2012, 14:43
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от eca
|
вы видимо не правильно поняли вопрос. мне нужно проверить соответствие строки именно формату даты, а не самой дате.
|
А как Вы проверите соответствие даты формату, не проверив саму дату?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
18.01.2012, 15:13
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
nerv_,
перечитывать первый пост до просветления.
особое внимание уделить коду.
Сообщение от eca
|
можно ли проверить, чтобы нельзя было повторить день, месяц или год (например так 'd-d-yy')
|
в рамках регулярных выражений - я не вижу способа.
ну, кроме перечислить все варианты размещения блоков относительно друг друга(6 штук)
Сообщение от eca
|
и можно ли заменить y{4}|y{2} одним выражением (y{2,4} не подходит)
|
ну, только если так(но вам не это наверно хотелось увидеть):
yy(y{2})?
|
|
18.01.2012, 15:47
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Gvozd
|
перечитывать первый пост до просветления.
|
Зачем?
Сообщение от Gvozd
|
в рамках регулярных выражений - я не вижу способа.
|
Сообщение от nerv_
|
Мне кажется регой дату не проверить.
|
Сообщение от eca
|
проверить, чтобы нельзя было повторить день, месяц или год (например так 'd-d-yy')
|
Чтобы это проверить, надо научить программу понимать, где месяц, где день, а где год. И как вы собираетесь проверить "формат", не проверив саму дату на правильность? Впрочем, если речь не идет о валидности даты, можно тупо в лоб проверять, например, так: две_цифры; разделитель; две_цифры; разделитель; четыре цифры. В таком случае не вижу смысла вообще проверять "формат" даты.
Тогда уж говорите не о проверке формата, а о валидности даты. Ибо, если она не валидна (а просто набор цифр), какая разница какой у них "формат"?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 18.01.2012 в 15:50.
|
|
18.01.2012, 16:19
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от nerv_
|
Зачем?
|
чтобы понять чего хочет хочет ТС, и не задавать глупых вопросов не имеющих к его задаче никакого отношения?
Мы же тут не на свободную тему общаемся, а все-таки вполне конкретную задачу решаем?
eca,
Вот так, в лоб можно решить вашу задачу
function is_date_format(str) {
var a = str.match(/^(y{4}|[dmy]{2})([^a-zA-Z0-9]+)(y{4}|[dmy]{2})([^a-zA-Z0-9]+)(y{4}|[dmy]{2})$/);
if(a.length != 6) {
return false;
}
var b = {};
b[a[1].substring(0,1)] = 1;
b[a[3].substring(0,1)] = 1;
b[a[5].substring(0,1)] = 1;
if(b.d && b.m && b.y) {
return true;
} else {
return false;
}
}
alert(is_date_format('dd-mm-yyyy'));
alert(is_date_format('dd-mm-dd'));
|
|
18.01.2012, 18:05
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Gvozd
|
чтобы понять чего хочет хочет ТС
|
Очень часто бывает, что:
1. тс сам не знает чего хочет
2. знает, но не понимает, как это реализовать
3. неверно формулирует задачу
4. выбирает далеко не самый лучший вариант ее решения
5. и т.д.
В данном случае скорее всего пункты 2 и 3.
Сообщение от Gvozd
|
Мы же тут не на свободную тему общаемся
|
Мы общаемся на тему javascript Если чем зацепил, измените.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|