JavaScript:檢查日期是否存在
19 May 2017檢查日期是否存在,這裡分為兩個部份
- 該年是否為閏年。例如:2016 年是閏年,那一年的 2 月有 29 天。
- 該日是否超過每個月份最大日期限制。例如:1 月最多 31 天,若有一個日期是「2017/01/32」必為不合法的日期。
閏年
若為閏年,則可取得 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) {
var dateObj = dateStr.split('/'); // yyyy/mm/dd
//列出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
- 2017/02/29 (不存在)
- 2015/03/31
- 2012/04/31 (不存在)
- 2012/04/29
- 2016/02/29
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。
Chrome。
new Date(Date.parse('2017-02-29'))
Wed Mar 01 2017 08:00:00 GMT+0800 (台北標準時間)
完整程式碼如下。
function isExistDate(dateStr) {
var dateObj = new Date(Date.parse(dateStr)); // yyyy/mm/dd
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