【问题标题】:Javascript - Get a date from any kind of stringJavascript - 从任何类型的字符串中获取日期
【发布时间】:2014-03-18 16:02:45
【问题描述】:

我想知道是否有办法(我希望有办法,否则我遇到了麻烦: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,指的是:12/12/2014)

【问题讨论】:

  • 看看moment.js
  • 如果字符串是“1234520141212”怎么办?
  • 任何时候你正好有 8 个数字在一起,如果你有超过 8 个数字怎么办?少于8个?忽略这些情况或尝试解析 8 的每个子字符串?
  • 约它出去吃饭! ;)
  • @rsegal :) 但这适用于任何类型的字符串吗?它可能会让它认为你认为它很胖。可能一部电影更容易被接受。

标签: javascript string date


【解决方案1】:

我确定,但如果您的字符串仅包含日期数字,您可以使用 RexEx 吗?

可能是这样的:

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

【讨论】:

  • 当然(在您编辑之后)这段代码不适用于 string3。
【解决方案2】:

用正则表达式从字符串中提取一个由八个数字组成的序列很简单,只需使用以下内容:

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

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

【讨论】:

  • 太好了,我不知道,谢谢,这正是我需要的!
【解决方案3】:

您应该为此使用正则表达式。

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

【讨论】:

  • 谢谢你这是我需要的:)
  • 万岁!如果您正在使用字符串,您应该阅读更多关于正则表达式的信息,它们非常棒。赞成票怎么样? :)
  • 是的,我必须提高我的一般知识 :) Oups 很抱歉投了赞成票!
【解决方案4】:

此解决方案将检查有效日期(不只是任何 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');

【讨论】:

  • 伟大的工作。我有 2 个厘米。一,你不应该再定义 indexOf 了,all major browsers 支持它。二,如果函数实际返回数组中的日期(如果未找到,则返回未定义)而不是真/假,这可能会更好。此外,处理有 2 个 8 位数字序列且只有一个正确的情况是明智的。 (在这种情况下,函数应该重新调用自身,直到找到有效日期。)
  • indexOf 仅被定义为考虑到 IE8。作为一名 Web 开发人员,我想自己停止支持这一点,但实际上,大多数人仍然在使用 IE 8 的 XP 上......你可以用逻辑做任何你想做的事情——我只是想回答 OP 的问题确定字符串中是否有日期(布尔值)。
  • “最”适用于我们的应用程序从谷歌分析报告。我也希望不是这样,相信我:)
  • @Patrick 那么你应该使用polyfill,所以如果浏览器已经定义了indexOf,它将使用本机函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2015-05-13
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多