我正在构建一个应用程序,我想创建一个带有“加号字符串”的日期对象,类似于PHP的strtotime()
方法。
基本上我希望能够说
var date = new Date(“+ 30秒”);
有没有办法以这种方式创建日期?我希望它能够接受基本时间值:
答案 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;
}
(或类似的东西。)