Разбор даты в jQuery без DateJS - PullRequest
4 голосов
/ 16 февраля 2011

Я пытаюсь разобрать дату в формате January 1, 1900 или February 1, 1900 и т. Д. Для всех месяцев ... и затем разделить месяц, день и год на их собственные объекты.

Iпытался использовать для этого регулярное выражение «из коробки», но:

  1. Это конкретное регулярное выражение выглядит слишком сложным и может легко сломаться
  2. Должен быть более простой регулярныйвыражение для использования, зная, что формат не изменится (и мы проверим дату на бэкэнде)

Я не хочу использовать библиотеку DateJS, так как кажется, что в нее включено много кодапросто проанализировать одну дату, так есть ли более простой способ написать регулярное выражение для этого?Есть ли другой маршрут, отличный от выполнения регулярных выражений или DateJS?

По какой-то причине регулярное выражение не работает в феврале и, как вы можете видеть, оно возвращает довольно много объектов в массиве, тогда как очевидно, чтобудет проще, если он просто вернет 3 объекта (месяц, день, год).Вот текущая функция, которую я написал с помощью регулярного выражения, которое я использую ...:

function convertDate(dateString) {
    // must be in the format MMMMMMM DD, YYYY OR MMM DD, YYYY
    // examples: January 1, 2000 or Jan 1, 2000 (notice no period for abbreviating January into Jan)
    var dateRegex = new RegExp('^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\\ (0?[1-9]|([12]\\d)|30))|(Feb(ruary)?\\ (0?[1-9]|1\\d|2[0-8]|(29(?=,\\ ((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\\,\\ ((1[6-9]|[2-9]\\d)\\d{2}))');
    var fullDate = dateString.match(dateRegex);
    console.log(fullDate);

    if (fullDate) {
        var month = fullDate[12];
        var day = fullDate[24];
        var year = fullDate[35];

        if (month == 'January' | month == 'Jan') { integerMonth = 1; } 
        else if (month == 'February' | month == 'Feb') { integerMonth = 2; } 
        else if (month == 'March' | month == 'Mar') { integerMonth = 3; } 
        else if (month == 'April' | month == 'Apr') { integerMonth = 4; } 
        else if (month == 'May') { integerMonth = 5; } 
        else if (month == 'June' | month == 'Jun') { integerMonth = 6; } 
        else if (month == 'July' | month == 'Jul') { integerMonth = 7; } 
        else if (month == 'August' | month == 'Aug') { integerMonth = 8; } 
        else if (month == 'September' | month == 'Sep') { integerMonth = 9; } 
        else if (month == 'October' | month == 'Oct') { integerMonth = 10; } 
        else if (month == 'November' | month == 'Nov') { integerMonth = 11; } 
        else if (month == 'December' | month == 'Dec') { integerMonth = 12; } 

        return {month : integerMonth, day : day, year : year}
    } else {
        return false;
    }
}

Ответы [ 2 ]

5 голосов
/ 16 февраля 2011

Объект Javascript Date может быть инициализирован строкой, и он будет преобразовывать формат, который вы используете, в правильную дату:

var d = new Date("January 1, 2000");
if (!isNaN(d.getMonth()) { // check for invalid date
  return {month : d.getMonth()+1, day : d.getDate(), year : d.getFullYear()};
} else {
  return false;
}

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

1 голос
/ 16 февраля 2011

Это будет работать, но не будет зависеть от месяцев и лет. Для этого достаточно 3-9 букв, одного или двух цифр, одной запятой и 4 цифр.

/^[a-z]{3,9} [0-9]{1,2}, [0-9]{4}$/i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...