校驗表單時可能會遇到校驗日期是否正確。能夠利用JS的內置對象Date
幫助咱們完成日期校驗。javascript
思路是首先用被校驗日期(假設爲A,可能爲字符串或數字)建立一個Date
對象(假設爲B)。
而後判斷A和B的年、月、日是否所有相等。若是是,說明A是合法的;不然,A的範圍有誤。java
用代碼表示爲:函數
// 被校驗日期A:2008年3月15日 var year = 2008, month = 3, date = 15; // 建立Date對象B var B = new Date(year, month-1, date); // 判斷A和B的年月日是否所有相等 if (year === B.getFullYear() && month === B.getMonth()+1 && date === B.getDate()) { // 所有相等,被校驗日期合法 } else { // 不所有相等,被校驗日期的年、月、日至少有一個錯誤。 }
這裏容易踩坑的地方是,Date
對象月份從零開始:0表示一月,1表示二月,...,11表示十二月。測試
爲何要構建一個Date
對象?這就要涉及到Date
構造函數的語法了。code
官網上上給出了四種調用構造函數的形式:對象
new Date()
new Date(value)
new Date(dateString)
new Date(new Date(year, month[, date[, hours[, minutes[, seconds[, milliseconds]]]]]);
解釋以下:ip
當拿到了被校驗日期的年、月、日以後,計算毫秒數或構造日期格式字符串都比較麻煩。因此這裏使用第四種。字符串
這時,調用Date
構造函數的另外一條規則就起做用了:若是參數值超過了合理範圍,則它會被調整到臨近值。我理解的就是,構造函數會爲不合理的參數作進位運算。get
舉個例子,new Date(2013,13,1)
至關於new Date(2014,1,1)
,也就是 2013年14月1日被進位成 2014年2月1日。it
再回到以前的校驗代碼:
// 被校驗日期A:2013年14月1日 var year = 2013, month = 14, date = 1; // 建立Date對象B var B = new Date(2013, 13, 1); // B --> new Date(2014, 1, 1); // B.getFullYear() === 2014 // B.getMonth() === 1 // B.getDate() === 1 // 能夠看到,year !== B.getFullYear() 而且 month !== B.getMonth() // 因此判斷出被校驗日期是非法的。
再加強一下咱們的程序,使之能夠判斷多種格式的被校驗日期:
我寫了一段簡易的代碼,僅供參考:
function isValidDate() { var year = 0, month = 0, date = 0; if (arguments.length === 3) { // 2008 3 15 // '2008' '3' '15' year = Number(arguments[0]); month = Number(arguments[1]); date = Number(arguments[2]); } else if (arguments.length === 2) { // '2008-03-15' '-' // '2008/3/15' '/' // 參數必須爲字符串類型,分隔符不能爲空字符串或數字 var str = arguments[0], seperator = arguments[1], dateArray = str.split(seperator); year = Number(dateArray[0]); month = Number(dateArray[1]); date = Number(dateArray[2]); } else if (arguments.length === 1) { // '20080315' // 20080315 // 參數必須爲8位,且只能爲數字 var str = String(arguments[0]); year = Number(str.slice(0, 4)); month = Number(str.slice(4, 6)); date = Number(str.slice(6)); } var dateObj = new Date(year, month-1, date), nYear = dateObj.getFullYear(), nMonth = dateObj.getMonth() + 1, nDate = dateObj.getDate(); if (year === nYear && month === nMonth && date === nDate) { return true; } else { return false; } } // 測試 isValidDate.assert = function(value) { if (value) { console.log('pass'); } else { console.log('failed'); } } isValidDate.test = function() { var assert = isValidDate.assert; assert(isValidDate(2008, 2, 29)===true); assert(isValidDate(2008, 3, 33)===false); assert(isValidDate(2017, 13, 01)===false); assert(isValidDate(2018, 5, 12)===true); assert(isValidDate('2008-2-29','-')===true); assert(isValidDate('2008/02/29','/')===true); assert(isValidDate('2008 03 17',' ')===true); assert(isValidDate('2008,13,01',',')===false); assert(isValidDate('2008,12,01',',')===true); assert(isValidDate('20080229')===true); assert(isValidDate('20081329')===false); assert(isValidDate('20081131')===false); assert(isValidDate(20080229)===true); assert(isValidDate(20081329)===false); assert(isValidDate(20081131)===false); } isValidDate.test();