Javascript日期解析加上字符串

时间:2014-03-25 20:32:10

标签: javascript date strtotime

我正在构建一个应用程序,我想创建一个带有“加号字符串”的日期对象,类似于PHP的strtotime()方法。

基本上我希望能够说

var date = new Date(“+ 30秒”);

有没有办法以这种方式创建日期?我希望它能够接受基本时间值:

  • 分钟

4 个答案:

答案 0 :(得分:1)

据我所知,即使是非常受欢迎的库moment.js也没有实现此功能。此外,Javascript this strtotime implementation无法处理您的输入。

所以我想我们必须自己写。这可以让你开始:

var parsePlus = (function () {
    "use strict";

    var converter = {
        'second': 1000,
        'minute': 1000 * 60,
        'hour': 1000 * 60 * 60
    };

    return function (input) {
        var sign = (input[0] === "+" || input[0] !== "-") ? 1 : -1,
            current = new Date().getTime();

        var parts = input.match(/(\+|-)?(\d+)\s*(second|minute|hour)s?/i);
        return new Date(current + sign * parts[2] * converter[parts[3]]);
    }
})();

console.log(parsePlus("+30seconds"));
console.log(parsePlus("-1hour"));

答案 1 :(得分:0)

Date函数接受数值

new Date(2011, 0, 1, 2, 3, 4, 567) // 1 Jan 2011, 02:03:04.567 in local timezone

你可以使用一个按空格分割字符串并将其提供给Date对象构造函数的函数

function s2date(s){return new Date(s.split(' '))}

答案 2 :(得分:0)

我继续自己创建了一个函数,因为其他东西似乎不存在。

function parseDate(date)
{
    if(date == "now" || date == "")
    {
        return new Date();
    }

    if(date.charAt("0") == "+")
    {
        date.replace("+", "");
        var cmp = date.split(" ");

        if(cmp[1].indexOf("seconds") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 1000));
        }
        else if(cmp[1].indexOf("minutes") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 1000));
        }
        else if(cmp[1].indexOf("hours") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 1000));
        }
        else if(cmp[1].indexOf("days") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 1000));
        }
        else if(cmp[1].indexOf("weeks") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 7 * 1000));
        }
        else if(cmp[1].indexOf("months") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 30 * 1000));
        }
        else if(cmp[1].indexOf("years") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 365 * 1000));
        }
    }

    if(date.charAt("0") == "-")
    {
        var cmp = date.split(" ");

        if(cmp[1].indexOf("seconds") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 1000));
        }
        else if(cmp[1].indexOf("minutes") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 1000));
        }
        else if(cmp[1].indexOf("hours") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 1000));
        }
        else if(cmp[1].indexOf("days") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 1000));
        }
        else if(cmp[1].indexOf("weeks") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 7 * 1000));
        }
        else if(cmp[1].indexOf("months") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 30 * 1000));
        }
        else if(cmp[1].indexOf("years") > -1)
        {
            return new Date((new Date()).getTime() + (cmp[0] * 60 * 60 * 24 * 365 * 1000));
        }
    }

    return new Date(date);
}

这接受以下输入:

"now" | "": returns current date

Datestring: returns corresponding date (this already worked in new Date(dateString))

[+ | -][#] [timevar]: returns current time [+ | -] [#] of [timevar]
     e.g. "+30 seconds"

答案 3 :(得分:0)

没有。你不能做var date = new Date("+30 seconds");但你可以这样做:

var date = new Date(Date.now()+(30 * 1000));

如果你想将它构建成一个函数,你必须拆分字符串并确定要添加多少毫秒:

function AddDate(string, timestamp){
    var s = string.split(' '), increaseby, newtime;
    switch(s[1]){
       case 'seconds':
           increaseby = 1000; // milliseconds in one second
           break;
       case 'minutes':
           increaseby = 1000 * 60; // milliseconds in a minute
           break;
    }

    newtime = (+s[0]) * increaseby;
    return timestamp + newtime;
}

(或类似的东西。)