regexp Парсинг ISO-8601 - PullRequest
       7

regexp Парсинг ISO-8601

5 голосов
/ 25 ноября 2011

В качестве ответа на вопрос, который я пытаюсь помочь с: javascript date.parse разница в Chrome и других браузерах

Мне нужна помощь в обновлении регулярного выражения, которое я нашел здесь:

JavaScript: Какие браузеры поддерживают синтаксический анализ строки даты ISO-8601 с Date.parse

для обработки 2011-11-24T09:00:27+0200

В настоящее время предполагается, что он обрабатывает 2011-11-24T09:00:27Z версию даты ISO

т.е. RX в

function(s){
    var day, tz, 
    rx= /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/, 
    p= rx.exec(s) || [];
    if(p[1]){
        day= p[1].split(/\D/).map(function(itm){
            return parseInt(itm, 10) || 0;
        });
        day[1]-= 1;
        day= new Date(Date.UTC.apply(Date, day));
        if(!day.getDate()) return NaN;
        if(p[5]){
            tz= parseInt(p[5], 10)*60;
            if(p[6]) tz += parseInt(p[6], 10);
            if(p[4]== "+") tz*= -1;
            if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
        }
        return day;
    }
    return NaN;
}

чтобы эта скрипка работала с IE и Safari


ОБНОВЛЕНИЕ: ответы сработали. Теперь я могу помочь другим разобрать дату ISO, возвращенную из Facebook API.

Ответы [ 2 ]

12 голосов
/ 25 ноября 2011

Чтобы заставить его работать с датами в формате 2011-11-24T09:00:27+0200, просто добавьте ? после последнего :, например:

/^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):?(\d\d))?$/

Разъяснения:

  (
    \d{4}\-\d\d\-\d\d     # date
    ([tT][\d:\.]*)?       # optional time
  )
  (
    [zZ]                  # UTC time zone
    |                     # or
    ([+\-])               # offset sign
    (\d\d)                # hour offset
    :?                    # optional delimiter
    (\d\d)                # minute offset
  )?                      # time zone is optional             

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

2 голосов
/ 25 ноября 2011

Я не уверен, что вы хотите, но ваше регулярное выражение неверно, попробуйте изменить конец так, чтобы он выглядел следующим образом /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d{3}))?$/, и он по крайней мере будет соответствовать тому, что вы ищете.

Исходное регулярное выражение искало символ, либо z, либо Z, либо +, либо -, за которым следуют 2 цифры, двоеточие, а затем еще 2 цифры, поэтому я изменил его, вместо того чтобы искать для 2 цифр, двоеточия и еще 2 цифр он выглядел как 3 цифры, как в вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...