Javascript 无法将字符串变量传递给JS日期对象

Javascript 无法将字符串变量传递给JS日期对象,javascript,date,Javascript,Date,我试图将字符串变量传递给JS date对象,并在将来创建日期。 这样做很容易: var d = new Date(); var year = d.getFullYear(); var month = d.getMonth(); var day = d.getDate(); var my_date = new Date(year + 1, month +1, day +1); 但是我如何用字符串变量传递它,这样我就可以实现如下功能: var d = new Date(); var year =

我试图将字符串变量传递给JS date对象,并在将来创建日期。 这样做很容易:

var d = new Date();
var year = d.getFullYear();
var month = d.getMonth();
var day = d.getDate();
var my_date = new Date(year + 1, month +1, day +1);
但是我如何用字符串变量传递它,这样我就可以实现如下功能:

var d = new Date();
var year = d.getFullYear();
var month = d.getMonth();
var day = d.getDate();
var my_variable = 'year + 1, month +1, day +1';
var my_date = new Date(my_variable);

在本例中,它返回无效的日期

您正在以字符串形式插入Javascript代码,这对date类没有任何意义

您可以将变量存储在一个数组中,以便将它们优雅地传递到最新

const dates = [year + 1, month +1, day +1]
const my_date = new Date(...dates);
我读到了一条后续评论,它指出,无论从何处检索数据,都只能从中获取字符串。首先,如果字符串的格式为'year+1,month+1,day+1',那么它对日期对象就没有意义。如果字符串仅由逗号分隔的3个数字组成,则可以在逗号处拆分字符串,并以相同的方式将其传递给日期对象

const dates = myString.split(',');
const my_date = new Date(...dates);

您将Javascript代码作为字符串插入,这对Date类没有意义

您可以将变量存储在一个数组中,以便将它们优雅地传递到最新

const dates = [year + 1, month +1, day +1]
const my_date = new Date(...dates);
我读到了一条后续评论,它指出,无论从何处检索数据,都只能从中获取字符串。首先,如果字符串的格式为'year+1,month+1,day+1',那么它对日期对象就没有意义。如果字符串仅由逗号分隔的3个数字组成,则可以在逗号处拆分字符串,并以相同的方式将其传递给日期对象

const dates = myString.split(',');
const my_date = new Date(...dates);
不幸的是,javascript(以及我所熟悉的所有语言)并不是这样工作的

您可以改为使用语句,它允许您将整个指令创建为字符串并运行该字符串

var my_variable = 'year + 1, month +1, day +1';
eval('var my_date = new Date(' + my_variable + ');');
但是使用
eval
是危险的,可能会让您受到意外的攻击。只有在绝对必要的情况下才使用它,并且如果您确信所使用的字符串是“安全的”

不幸的是,javascript(以及我所知道的所有语言)并不是这样工作的

您可以改为使用语句,它允许您将整个指令创建为字符串并运行该字符串

var my_variable = 'year + 1, month +1, day +1';
eval('var my_date = new Date(' + my_variable + ');');
但是使用
eval
是危险的,可能会让您受到意外的攻击。仅在绝对必要的情况下使用,并且如果您确定使用的字符串是“安全的”

请注意 你需要对日期算术稍微小心一点,因为它不是对称的,可能会给出奇怪的结果,例如,2016年2月29日+1年等于2017年3月1日,7月31日减去1个月等于7月1日,因为没有6月31日,它会滚动到7月,依此类推

给定原始需求,您可能会考虑特定格式的解析器,例如

函数myParse(s,日期){
日期=日期| |新日期();
//默认值对象
var值={
年:{符号:1,值:0},月:{符号:1,值:0},日:{符号:1,值:0}
};
//标记化字符串
var part=s.toLowerCase().match(/[a-z]+|\d+|[+-]/ig);
//处理代币
如果(部分){
对于(变量i=0,iLen=part.length;i注释
你需要对日期算术稍微小心一点,因为它不是对称的,可能会给出奇怪的结果,例如,2016年2月29日+1年等于2017年3月1日,7月31日减去1个月等于7月1日,因为没有6月31日,它会滚动到7月,依此类推

给定原始需求,您可能会考虑特定格式的解析器,例如

函数myParse(s,日期){
日期=日期| |新日期();
//默认值对象
var值={
年:{符号:1,值:0},月:{符号:1,值:0},日:{符号:1,值:0}
};
//标记化字符串
var part=s.toLowerCase().match(/[a-z]+|\d+|[+-]/ig);
//处理代币
如果(部分){

对于(var i=0,iLen=part.length;iYeah,它不是那样工作的。为什么你把本质上是Javascript代码的东西作为字符串作为输入?!正如@deceze所说,它肯定不是那样工作的。你可以使用
eval
语句?字符串作为输入是必需的,因为我会传递到那里data@freefaller每次你提到
eval
您还应该使用:
*警告*不要使用EVAL
为了操纵日期,我建议您使用类似于或其他的库。是啊,这样不行。为什么您要将本质上是Javascript代码的字符串作为输入?!正如@deceze所说,它肯定不起作用。您可以使用
EVAL
状态需要字符串作为输入,因为我将传递到那里data@freefaller每次您提到
eval
时,您还应该使用:
*警告*不要使用eval
来操纵日期,我建议您使用类似或其他的库。我认为问题在于,值存储在单个字符串中,而不是一个字符串中ries/array of Usage valuesYeah,我刚刚注意到他的后续评论。如果字符串是用逗号分隔的数字,他可以在逗号处拆分字符串并将每个元素解析为一个数字,然后以相同的方式将其传递给Date对象。我相信问题在于值存储在单个字符串中,而不是一个序列/数组中如果字符串是用逗号分隔的数字,他可以在逗号处拆分字符串并将每个元素解析为一个数字,然后以同样的方式将其传递给Date对象。