javascript - yyyymmddhhmmss - 檢查一個字符串是否是日期值




js date format yyyymmddhhmmss (10)

什麼是簡單的方法來檢查一個值是否是一個有效的日期,允許任何已知的日期格式。

例如,我的值為10-11-2009 / 10/11/2009 / 2009-11-10T07:00:00+0000 ,它們應該全部被識別為日期值,值350 ,它們不應該被確認為日期值。 如果可能的話,檢查這個最簡單的方法是什麼? 因為時間戳也被允許。


2015更新

這是一個古老的問題,但其他新問題如:

因為這個重複,所以我認為在這裡添加一些新的信息是很重要的。 我寫這篇文章是因為我害怕人們實際上複製並粘貼這裡發布的一些代碼並在生產中使用它。

這裡的大多數答案要么使用一些複雜的正則表達式,只匹配一些非常特定的格式,而是實際做錯了它(比如匹配1月32日,而不像實際的ISO日期匹配 - 請參閱demo ), 或者他們嘗試將任何內容傳遞給Date構造函數並希望最好。

使用矩

正如我在這個答案中解釋的那樣,目前有一個可用的庫: Moment.js

它是一個解析,驗證,操作和顯示JavaScript日期的庫,它具有比標準JavaScript日期處理函數更豐富的API。

它是12kB縮小/ gzip並在Node.js和其他地方工作:

bower install moment --save # bower
npm install moment --save   # npm
Install-Package Moment.js   # NuGet
spm install moment --save   # spm
meteor add momentjs:moment  # meteor

使用Moment,您可以非常詳細地查看有效日期。 有時添加一些關於您期望的格式的線索非常重要。 例如,一個日期如06/22/2015看起來像一個有效的日期,除非你使用DD / MM / YYYY格式,在這種情況下這個日期應該被拒絕為無效。 有幾種方法可以告訴Moment您期望的格式,例如:

moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false

true論據是在那裡,所以Moment不會試圖解析輸入,如果它不完全符合提供的格式之一(在我看來應該是默認行為)。

您可以使用內部提供的格式:

moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true

你可以使用多種格式作為數組:

var formats = [
    moment.ISO_8601,
    "MM/DD/YYYY  :)  HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015  :)  13*17*21", formats, true).isValid(); // true
moment("06/22/2015  :(  13*17*21", formats, true).isValid(); // false

請參閱: DEMO

其他圖書館

如果你不想使用Moment.js,還有其他庫:

更多信息

也可以看看:

Rob Gravelle撰寫的關於JavaScript日期解析庫的一系列文章:

底線

當然,任何人都可以嘗試重新發明輪子,編寫一個正則表達式(但實際上請務必先閱讀ISO 8601和RFC 3339),或者使用隨機數據調用buit-in構造函數來解析錯誤消息,如'Invalid Date''Invalid Date'確保這條消息在所有平台上完全相同 ?在所有地區?將來?), 或者您可以使用經過測試的解決方案並利用您的時間來改進它,而不是重新創造它。 這裡列出的所有庫都是開源的免費軟件。


new Date(date) === 'Invalid Date'僅適用於Firefox和Chrome。 IE8(我在我的機器上用於測試目的)提供NaN。

正如接受的答案所述, Date.parse(date)也適用於數字。 所以為了解決這個問題,你也可以檢查它不是一個數字(如果這是你想確認的東西)。

var parsedDate = Date.parse(date);

// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
    /* do your work */
}

嘗試這個:

if (var date = new Date(yourDateString)) {
    // if you get here then you have a valid date       
}

在嘗試了上面列出的所有答案之後,我最終得出了以下結論:

var checkDateValue = function(date) {
    return date && (!(new Date(date) == "Invalid Date") && !isNaN(new Date(date)));
};

請注意, new Date(date) !== "Invalid Date" 始終為真。 希望這可以幫助。


是否可以檢查日期相關函數是否可用於該對像以查找它是否是Date對象?

喜歡

var l = new Date();
var isDate = (l.getDate !== undefined) ? true; false;

這個可調用函數完美工作,對於有效日期返回true。 請務必使用ISO格式的日期(yyyy-mm-dd或yyyy / mm / dd)進行呼叫:

function validateDate(isoDate) {

    if (isNaN(Date.parse(isoDate))) {
        return false;
    } else {
        if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
            return false;
        }
    }
    return true;
}

這就是我現在正在處理的應用程序中解決這個問題的方法:

根據krillgar的反饋進行更新:

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}

要么...

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) ) ) ? true : false;
}

....


這工作:

var isDate = function(date) {
    return ((new Date(date)).toString() !== "Invalid Date") ? true : false;         
}

這樣的事情呢? 它會測試它是一個Date對像還是一個日期字符串:

function = isDate(value) {
  var dateFormat;
  if (toString.call(value) === '[object Date]') {
    return true;
  }
  if (typeof value.replace === 'function') {
    value.replace(/^\s+|\s+$/gm, '');
  }
  dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
  return dateFormat.test(value);
}

我應該提到,這不會測試ISO格式化的字符串,但是對於RegExp,您應該做的更好。


這裡沒有答案檢查日期是否無效,例如2月31日。該函數通過檢查返回的月份是否等於原始月份並確保提供有效年份來解決該問題。

//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy
function isValidDate(s) {
  var separators = ['\\.', '\\-', '\\/'];
  var bits = s.split(new RegExp(separators.join('|'), 'g'));
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1];
} 




date-format