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');. 布爾。
  • 等等。

來源: http://momentjs.com/docs/ : http://momentjs.com/docs/

我想告訴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()))

結合我發現的最佳性能結果,檢查給定的對象:

結果如下:

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;
}




date