Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   regexp формат даты (https://javascript.ru/forum/misc/24844-regexp-format-daty.html)

eca 16.01.2012 14:51

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} не подходит)

Gvozd 16.01.2012 15:09

Цитата:

Сообщение от eca
формат даты - одна или две буквы d(день), одна или две m(месяц), две или четыре буквы y(год). порядок не важен. день, месяц и год разделены одинаковыми разделителями.

10-11-12
01/02/03
Что это за даты, согласно вашего алгоритма?

eca 16.01.2012 15:20

Цитата:

Сообщение от Gvozd
10-11-12
01/02/03
Что это за даты, согласно вашего алгоритма?

что это за дата зависит от формата, если формат например 'dd-mm-yy', то это 10 ноября 2012г

nerv_ 16.01.2012 16:45

Мне кажется регой дату не проверить. Придется разбирать по частям. И проверять по числам. Например: 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("."));

но получается какой-то велосипед.) Писал прям форум, ес че звиняйте ^_^

eca 16.01.2012 17:12

Цитата:

Сообщение от 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'.

nerv_ 18.01.2012 14:43

Цитата:

Сообщение от eca
вы видимо не правильно поняли вопрос. мне нужно проверить соответствие строки именно формату даты, а не самой дате.

А как Вы проверите соответствие даты формату, не проверив саму дату? :)

Gvozd 18.01.2012 15:13

nerv_,
перечитывать первый пост до просветления.
особое внимание уделить коду.
Цитата:

Сообщение от eca
можно ли проверить, чтобы нельзя было повторить день, месяц или год (например так 'd-d-yy')

в рамках регулярных выражений - я не вижу способа.
ну, кроме перечислить все варианты размещения блоков относительно друг друга(6 штук)
Цитата:

Сообщение от eca
и можно ли заменить y{4}|y{2} одним выражением (y{2,4} не подходит)

ну, только если так(но вам не это наверно хотелось увидеть):
yy(y{2})?

nerv_ 18.01.2012 15:47

Цитата:

Сообщение от Gvozd
перечитывать первый пост до просветления.

Зачем? :)
Цитата:

Сообщение от Gvozd
в рамках регулярных выражений - я не вижу способа.

Цитата:

Сообщение от nerv_
Мне кажется регой дату не проверить.

Цитата:

Сообщение от eca
проверить, чтобы нельзя было повторить день, месяц или год (например так 'd-d-yy')

Чтобы это проверить, надо научить программу понимать, где месяц, где день, а где год. И как вы собираетесь проверить "формат", не проверив саму дату на правильность? Впрочем, если речь не идет о валидности даты, можно тупо в лоб проверять, например, так: две_цифры; разделитель; две_цифры; разделитель; четыре цифры. В таком случае не вижу смысла вообще проверять "формат" даты.
Тогда уж говорите не о проверке формата, а о валидности даты. Ибо, если она не валидна (а просто набор цифр), какая разница какой у них "формат"?

Gvozd 18.01.2012 16:19

Цитата:

Сообщение от 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'));

nerv_ 18.01.2012 18:05

Цитата:

Сообщение от Gvozd
чтобы понять чего хочет хочет ТС

Очень часто бывает, что:
1. тс сам не знает чего хочет
2. знает, но не понимает, как это реализовать
3. неверно формулирует задачу
4. выбирает далеко не самый лучший вариант ее решения
5. и т.д.

В данном случае скорее всего пункты 2 и 3.
Цитата:

Сообщение от Gvozd
Мы же тут не на свободную тему общаемся

Мы общаемся на тему javascript ;) Если чем зацепил, измените.


Часовой пояс GMT +3, время: 15:44.