Javascript - 从任何类型的字符串中获取日期

时间:2014-03-18 16:02:46

标签: javascript string date

我想知道是否有办法(我希望有一种方法,或者我遇到麻烦:p),找到任何一种字符串的日期。

以下是一些让您了解我要找的内容的示例:

var string1 = 'blabla-test-20140215.dat'

我需要访问'20140215'

var string2 = 'blabla_Test.20141212'

我需要访问'20141212'

好吧,我希望能够在字符串中找到yyyymmdd格式的日期,无论字符串是什么。

谢谢你,如果你有任何线索,我还没有在互联网上找到任何东西。

编辑:

字符串中可以有其他数字,但始终小于8。 例如:

var string3 = 'blabla-2526-20141212'

我要找的日期总是与其他数字分开。我不能:

var string4 = 'blabla-252620141212'

我只是想找到代表日期的数字(格式为yyyymmdd,例如在string3中我想要20141212,参考:2014年12月12日)

4 个答案:

答案 0 :(得分:3)

我注意到,但如果你的字符串只包含日期的数字,你可以使用RexEx吗?

可能是这样的:

var regex = /[0-9]+/;
var string1 ="blabla-test-20140215.dat";
var found = regex.exec(string1); 
alert('Found: ' + found);

答案 1 :(得分:2)

使用正则表达式从字符串中提取八个数字序列非常简单,只需使用以下内容:

var dateString = (/\d{8}/.exec(string) || [])[0];

这将在给定的字符串中找到第一个八个字符长的数字串。如果不存在这样的序列,则它将是未定义的。然后,您可以根据需要使用它来创建Date对象。

答案 2 :(得分:2)

你应该使用正则表达式。

re = /(\d{4})(\d{2})(\d{2})/g //create a regex that matches: 4 digits followed by 2 digits followed by 2 digits
///// yyyy     mm       dd  
result = re.exec(string1) //execute the regex
// now, access the different capture groups according to their indexes
console.log(result[1]) // yyyy
console.log(result[2]) // mm
console.log(result[3]) // dd

答案 3 :(得分:2)

此解决方案将检查有效日期(不只是任意8个任意数字):

function hasDate(input) {
    var matches = input.match(/(\d{4})(\d{2})(\d{2})/),
        indexOf = function (elem, arr) {
            var len = arr.length, i;
            for (i = 0; i < len; i++) {
                if (arr[i] === elem) {
                    return i;
                }
            }

            return -1;
        },
        months31 = [1, 3, 5, 7, 8, 10, 12],
        idx, isLeapYear,
        year, month, day;
    if (matches) {
        year = parseInt(matches[1]);
        month = parseInt(matches[2]);
        day = parseInt(matches[3]);

        //Check invalid dates from the start
        if (month < 1 || month > 12) {
            return false;
        }
        else if (day < 1 || day > 31) {
            return false;
        }

        idx = indexOf(month, months31);
        isLeapYear = ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);        

        //Month has 31 days, we are good
        if (idx >= 0) {
            return true;
        }
        //Feb - check for leap year
        else if (month === 2 && (day <= 28 || (isLeapYear && day <= 29))) {
            return true;
        }
        //All other months
        else if (month !== 2 && day <= 30) {
            return true;
        }
    }

    //If we got this far, its a bad date
    return false;
}

//return true
hasDate('blabla_Test.20141212');
//return false
hasDate('blabla_Test.20140229');
//return true
hasDate('blah_20140228');
//return true
hasDate('blah_20000229');