JavaScript:檢查日期是否存在

檢查日期是否存在,這裡分為兩個部份

閏年

若為閏年,則可取得 29 這個日期。簡單來說等等就會用比對的方式決定是否為閏年。

new Date(2016, 1, 29).getDate() // 29

意即,正確的日期就會得到正確的數字。

new Date(2016, 1, 28).getDate() // 28

若非閏年,則會得到不正確的數字。

new Date(2017, 1, 29).getDate() // 1

程式碼

若日期存在,則 isExistDate 回傳 true,反之回傳 false。

function isExistDate(dateStr) { // yyyy/mm/dd
  var dateObj = dateStr.split('/');

  //列出12個月,每月最大日期限制
  var limitInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  var theYear = parseInt(dateObj[0]);
  var theMonth = parseInt(dateObj[1]);
  var theDay = parseInt(dateObj[2]);
  var isLeap = new Date(theYear, 1, 29).getDate() === 29; // 是否為閏年?

  if(isLeap) { // 若為閏年,最大日期限制改為 29
    limitInMonth[1] = 29;
  }

  // 比對該日是否超過每個月份最大日期限制
  return theDay <= limitInMonth[theMonth - 1]
}

Demo

isExistDate('2017/02/29') //false
isExistDate('2015/03/31') //true
isExistDate('2012/04/31') //false
isExistDate('2012/04/29') //true
isExistDate('2016/02/29') //true

注意

由於Date.parse()的判斷是依各家瀏覽器而有所不同,因此不建議使用Date.parse()判斷時間是否合法。

例如: Date.parse()對於不合法的時間 (例如:2017/02/29) 應該要回傳 NaN,在 Firefox 的確如此,但 Chrome 無論在什麼月份只有日期大於 31 (即 32) 才會回傳 NaN,並且字串「2017/02/29」會被轉為「2017/03/01」。

Firefox。

JavaScript:檢查日期是否存在 - Date.parse() - Firefox

Chrome。

JavaScript:檢查日期是否存在 - Date.parse() - Chrome

new Date(Date.parse('2017-02-29'))
Wed Mar 01 2017 08:00:00 GMT+0800 (台北標準時間)

完整程式碼如下。

function isExistDate(dateStr) { // yyyy/mm/dd
  var dateObj = new Date(Date.parse(dateStr));
  var limitInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  var theYear = dateObj.getFullYear();
  var theMonth = dateObj.getMonth();
  var theDay = dateObj.getDate();
  var isLeap = new Date(theYear, 1, 29).getDate() === 29;

  if(isLeap) {
    limitInMonth[1] = 29;
  }

  return theDay <= limitInMonth[theMonth - 1]
}

Demo,不存在的日期卻回傳 true。

isExistDate('2017/02/29') // true

Date.parse()


comments powered by Disqus