2013-06-06 2 views
1

Я использую регулярное выражение для соответствия формату даты. а также вывести год, месяц, дату с даты. но я не могу получить полную стоимость года здесь. если я вхожу 2013-02-29, чем я получаю 20 в год вместо 2013. То, что я пытаюсь здесь: -Нужна помощь в извлечении года с даты?

$(document).ready(function(){ 
    var dateVal = '2013-06-01'; 
    var rxDatePattern = /^(19|20)\d\d(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/; 
    var dtArray = dateVal.match(rxDatePattern); 

    dtYear = dtArray[1]; 
    dtMonth = dtArray[3]; 
    dtDay = dtArray[5]; 

    jQuery.each(dtArray, function(index, value) { 
     console.log(index + ': ' + value); 
    }); 
}); 

Я получаю выход: -

0: 2013-06-01 

1: 20 

2: - 

3: 06 

4: - 

5: 01 

здесь скрипку: http://jsfiddle.net/roop1886/rYh8N/1/

Вот полный код, где я использую выше код: -

//varify date formate 
jQuery.validator.addMethod(
    "siteDateValidator", 
    function (value, element) { 
     var currVal = value; 
     if (currVal != '') { 
      var rxDatePattern = /^(19|20)\d\d(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/; 
      var dtArray = currVal.match(rxDatePattern); 
      if (dtArray == null) { 
       return false; 
      } 
      dtYear = (dtArray[1]); 
      dtMonth = (dtArray[3]); 
      dtDay = (dtArray[5]); 

      if (dtMonth < 1 || dtMonth > 12) return false; 
      else if (dtDay < 1 || dtDay > 31) return false; 
      else if ((dtMonth == 4 || dtMonth == 6 || dtMonth == 9 || dtMonth == 11) && dtDay == 31) return false; 
      else if (dtMonth == 2) { 
       var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0)); 
        if (dtDay > 29 || (dtDay == 29 && !isleap)){ 
         return false; 
        } 
      } 
     } 
     return true; 
    }, 
    "Please enter a valid date, date format should be(yyyy-mm-dd) and year should be greater than equal to 1900." 
); 
+2

неправильная группировка '/^((?: 19 | 20) \ d \ d) (-) (0 [1- 9] | 1 [012]) (-) (0 [1-9] | [12] [0-9] | 3 [01]) $/' – Prinzhorn

+0

Что не так с' dateValue.split ('-') [ 0] '? – RobG

ответ

1

Замените свое регулярное выражение, которое вы пропустили для группы на год. она должна быть (?:19|20)\d\d) вместо (19|20)\d\d

/^((?:19|20)\d\d)(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/ 

Здесь работает скрипку: - http://jsfiddle.net/roop1886/rYh8N/2/

4

Почему бы не использовать сборку javascript Date class?

var d = new Date("2013-02-29"); 
d.getFullYear(); // 2013 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Update: Вы можете обнаружить, если данная дата была недействительна по телефону:

var valid = !isNaN(d.getTime()); // returns true if valid, false if invalid 
+0

Я использую эту часть кода, подтверждающую, что пользователь получает определенный формат даты в проверке jquery. – Roopendra

+0

Ограниченная поддержка форматов даты ISO8601 была введена с ES5, и до этого даты синтаксического анализа были полностью зависимыми от реализации. IE8 и, возможно, другие браузеры не поддерживают вышеперечисленное. – RobG

+0

Я добавил обновление, показывающее, как определить действительную/недействительную дату –

1

Почему бы не использовать раскол()?

var dateVal = '2013-02-29'; 
var dtArray = dateVal.split("-"); 

dtYear = (dtArray[0]); 
dtMonth = (dtArray[1]); 
dtDay = (dtArray[2]); 

alert(dtYear); 
alert(dtMonth); 
alert(dtDay); 
+0

спасибо, но проверьте мой обновленный que. Я думаю, что это не соответствует моему требованию. знаю, я могу это сделать, используя split – Roopendra

1

А что-то вроде этого:

var dateVal = '2013-06-01'; 
var parts = dateVal.match(/(\d{4})-(\d{2})-(\d{2})/) 
var testDate = new Date(parts[1], parts[2] - 1, parts[3]) 
var isFormatValid = parts[1] == testDate.getFullYear()  && // format check 
        parts[2] == testDate.getMonth () + 1 && 
        parts[3] == testDate.getDate () 

var isBusinessValid = isFormatValid && parts[1] >= 1900; // business related 

alert(dateVal + "\n" + testDate + "\n" + isFormatValid + "\n" + isBusinessValid) 

В этом случае вам не нужно иметь дело с полной поддержкой даты в своем регулярном выражении, просто извлечь соответствующие части, построить Date объект и сравнить с введенным вводом. Javascript позаботится о високосных годах и материалах для вас.

+0

спасибо за ваше время. Мне нужно проверить год должен быть больше 1900. поэтому я взял это regex – Roopendra

+1

В этом случае вы можете изменить 'parts [1] == testDate.getFullYear() && parts [1]> 1900'. Моя точка зрения: не пытайтесь делать все с помощью большого регулярного выражения. –

1

Вот простой ответ:

var rxDatePattern = /^(19[\d]{2}|20[\d]{2})(\-)(0[1-9]|1[012])(\-)(0[1-9]|[12][0-9]|3[01])$/; 
+0

Уважаемый, он также подтвердит '9200-01-01'. Мне нужно, чтобы год был больше 1900 – Roopendra

+0

@Roopendra: проверьте мой новый ответ –

+0

спасибо Man ... :) +1 за вашу коррекцию и время. Он также работает. – Roopendra

0

Если вы хотите, чтобы подтвердить дату и формат, вы можете использовать:

// Validate date in format yyyy-mm-dd 
// Leading zeros on single digit months and days are optional 
function validateDate(dateString) { 
    var s = dateString.split('-'); 
    var d = new Date(s[0], --s[1], s[2]); 
    return d && d.getFullYear() == s[0] && d.getDate() == s[2]; 
} 

Если вы хотите проверить, что одна цифра месяцев и дней имеют ведущий ноль, идите на это, но я не вижу смысла.

Смежные вопросы