yyyymmdd - 在JavaScript中檢測“無效日期”日期實例
javascript get date format (20)
你可以簡單地使用moment.js
這裡是一個例子:
var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false
文檔中的驗證部分非常清晰。
而且,以下解析標記導致無效日期:
-
overflow
:日期字段的溢出,例如該月的第13個月,第32日(或非閏年的2月29日),該年的第367日等溢出包含無效的索引單位匹配#invalidAt(見下文); -1意味著沒有溢出。 -
invalidMonth
:無效的月份名稱,如moment('Marbruary','MMMM');. 包含無效的月份字符串本身,否則為空。 -
empty
:一個不包含任何可解析的輸入字符串,比如moment('this is nonsense');. 布爾。 - 等等。
我想告訴JS中有效和無效日期對象之間的區別,但不知道如何:
var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'
任何寫作isValidDate
函數的想法?
- Ash推薦使用
Date.parse
來解析日期字符串,它提供了一種權威的方法來檢查日期字符串是否有效。 - 如果可能的話,我更喜歡的是讓我的API接受一個Date實例,並能夠檢查/斷言它是否有效。 Borgar的解決方案就是這樣做的,但我需要跨瀏覽器進行測試。 我也懷疑是否有更優雅的方式。
- Ash讓我覺得沒有我的API接受
Date
實例,這將是最容易驗證的。 - Borgar建議測試
Date
實例,然後測試Date
的時間值。 如果日期無效,則時間值為NaN
。 我檢查了ECMA-262並且這種行為出現在標準中,這正是我要找的。
一般來說,我會堅持在瀏覽器堆棧中植入日期。 這意味著從回复的日期起,在Chrome,Firefox和Safari中調用toDateString()時,您總是會收到“無效日期”。
if(!Date.prototype.isValidDate){
Date.prototype.isValidDate = function(){
return this.toDateString().toLowerCase().lastIndexOf('invalid') == -1;
};
}
雖然我沒有在IE中測試過。
以下是我的做法:
if ( Object.prototype.toString.call(d) === "[object Date]" ) {
// it is a date
if ( isNaN( d.getTime() ) ) { // d.valueOf() could also work
// date is not valid
}
else {
// date is valid
}
}
else {
// not a date
}
你可以將你的日期和時間轉換為毫秒getTime()
此getTime()
方法無效時返回不是數字NaN
if(!isNaN(new Date("2012/25/255").getTime()))
return 'valid date time';
return 'Not a valid date time';
受到Borgar方法的啟發,我確信代碼不僅能驗證日期,還能確保日期是真實的日期,這意味著不允許像2011年9月31日和2011年2月29日這樣的日期。
function(dateStr) {
s = dateStr.split('/');
d = new Date(+s[2], s[1]-1, +s[0]);
if (Object.prototype.toString.call(d) === "[object Date]") {
if (!isNaN(d.getTime()) && d.getDate() == s[0] &&
d.getMonth() == (s[1] - 1)) {
return true;
}
}
return "Invalid date!";
}
嘗試驗證日期(例如2/31/2012)時,這些答案都不適用於我(在Safari 6.0中測試過),但是,嘗試使用大於31的任何日期時,它們都可以正常工作。
所以我不得不蠻力。 假定日期格式為mm/dd/yyyy
。 我正在使用@broox答案:
Date.prototype.valid = function() {
return isFinite(this);
}
function validStringDate(value){
var d = new Date(value);
return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}
validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false
好的解決方案 包含在我的輔助函數庫中,現在看起來像這樣:
Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>
return Object.prototype.toString.call(obj) === '[object Date]';
}
Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>
return Object.isDate(obj) && !isNaN(obj.getTime());
}
對於Angular.js項目,您可以使用:
angular.isDate(myDate);
您可以通過檢查Date
對象的有效性
d instanceof Date && isFinite(d)
為了避免交叉框架問題,可以使用替換檢查instanceof
Object.prototype.toString.call(d) === '[object Date]'
在Borgar的回答中調用getTime()
是不必要的,因為isNaN()
和isFinite()
都隱式轉換為數字。
想要提到的是,jQuery UI DatePicker小部件有一個非常好的日期驗證器實用程序方法,用於檢查格式和有效性(例如,不允許01/33/2013日期)。
即使您不希望將頁面上的日期選擇器小部件用作UI元素,也可以隨時將其.js庫添加到您的頁面,然後調用驗證器方法,並將要驗證的值傳遞給它。 為了讓生活更輕鬆,它需要一個字符串作為輸入,而不是JavaScript日期對象。
請參閱: http://api.jqueryui.com/datepicker/ : http://api.jqueryui.com/datepicker/
它不是作為一種方法列出的,而是作為一種效用函數存在的。 搜索“parsedate”頁面,你會發現:
$ .datepicker.parseDate(格式,值,設置) - 從指定格式的字符串值中提取日期。
用法示例:
var stringval = '01/03/2012';
var testdate;
try {
testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
// Notice 'yy' indicates a 4-digit year value
} catch (e)
{
alert(stringval + ' is not valid. Format must be MM/DD/YYYY ' +
'and the date value must be valid for the calendar.';
}
(有關指定日期格式的更多信息,請http://api.jqueryui.com/datepicker/#utility-parseDate )
在上例中,由於'01 / 03/2012'是指定格式的日曆有效日期,因此您不會看到警報消息。 但是,例如,如果您將'stringval'等於'13 / 04/2013',那麼您將收到警報消息,因為值'13 / 04/2013'不是日曆有效的。
如果成功解析了傳入的字符串值,則'testdate'的值將是表示傳入的字符串值的Javascript Date對象。 如果不是,它將是未定義的。
我寫了這個函數。 傳遞一個字符串參數,它會根據這種格式“dd / MM / yyyy”確定它是否是有效的日期。
這裡是一個測試
輸入:“hahaha”,輸出:false。
輸入:“29/2/2000”,輸出:真。
輸入:“29/2/2001”,輸出:false。
function isValidDate(str) {
var parts = str.split('/');
if (parts.length < 3)
return false;
else {
var day = parseInt(parts[0]);
var month = parseInt(parts[1]);
var year = parseInt(parts[2]);
if (isNaN(day) || isNaN(month) || isNaN(year)) {
return false;
}
if (day < 1 || year < 1)
return false;
if(month>12||month<1)
return false;
if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
return false;
if ((month == 4 || month == 6 || month == 9 || month == 11 ) && day > 30)
return false;
if (month == 2) {
if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0 && (year % 100) == 0)) {
if (day > 29)
return false;
} else {
if (day > 28)
return false;
}
}
return true;
}
}
我的解決方案是簡單地檢查你是否得到有效的日期對象:
履行
Date.prototype.isValid = function () {
// An invalid date object returns NaN for getTime() and NaN is the only
// object not strictly equal to itself.
return this.getTime() === this.getTime();
};
用法
var d = new Date("lol");
console.log(d.isValid()); // false
d = new Date("2012/09/11");
console.log(d.isValid()); // true
我非常喜歡克里斯托夫的方法(但沒有足夠的聲望投票)。 對於我的使用,我知道我將始終有一個Date對象,所以我只是用有效的()方法延長日期。
Date.prototype.valid = function() {
return isFinite(this);
}
現在我可以寫這個,它比檢查代碼中的isFinite更具描述性。
d = new Date(userDate);
if (d.valid()) { /* do stuff */ }
所選的答案非常好,我也在使用它。 但是,如果您正在尋找驗證用戶日期輸入的方法,則應該意識到Date對象非常持久,可能會將看似無效的構造參數變為有效的構造參數。 以下單元測試代碼說明了這一點:
QUnit.test( "valid date test", function( assert ) {
//The following are counter-examples showing how the Date object will
//wrangle several 'bad' dates into a valid date anyway
assert.equal(isValidDate(new Date(1980, 12, 15)), true);
d = new Date();
d.setFullYear(1980);
d.setMonth(1);
d.setDate(33);
assert.equal(isValidDate(d), true);
assert.equal(isValidDate(new Date(1980, 100, 150)), true);
//If you go to this exterme, then the checker will fail
assert.equal(isValidDate(new Date("This is junk")), false);
//This is a valid date string
assert.equal(isValidDate(new Date("November 17, 1989")), true);
//but is this?
assert.equal(isValidDate(new Date("November 35, 1989")), false);
//Ha! It's not. So, the secret to working with this version of
//isValidDate is to pass in dates as text strings... Hooboy
//alert(d.toString());
});
最短的答案來檢查有效日期
if(!isNaN(date.getTime()))
結合我發現的最佳性能結果,檢查給定的對象:
- 是一個Date實例( 這裡是基準 )
- 有一個有效的日期( jsperf.com/detecting-an-invalid-date )
結果如下:
function isValidDate(input) {
if(!(input && input.getTimezoneOffset && input.setUTCFullYear))
return false;
var time = input.getTime();
return time === time;
};
這只是為我工作
new Date('foo') == 'Invalid Date'; //is true
然而,這沒有奏效
new Date('foo') === 'Invalid Date'; //is false
這裡已經有太多複雜的答案,但一條簡單的線就足夠了(ES5):
Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;
甚至在ES6中:
Date.prototype.isValid = d => !isNaN(Date.parse(d));
// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());
IsValidDate: function(date) {
var regex = /\d{1,2}\/\d{1,2}\/\d{4}/;
if (!regex.test(date)) return false;
var day = Number(date.split("/")[1]);
date = new Date(date);
if (date && date.getDate() != day) return false;
return true;
}