在JS中添加/减去时间

5

最近我在玩JS,发现了一些有趣的东西。这是我写入Chrome控制台的内容:

today = new Date()
-> Mon Apr 29 2013 13:06:01 GMT+0200 (CEST)
DAY = 1000 * 3600 * 24
-> 86400000
today - 2 * DAY
-> 1367060761452
today + 2 * DAY
-> "Mon Apr 29 2013 13:06:01 GMT+0200 (CEST)172800000"

我想知道为什么在执行加法或减法操作时,会得到不同类型的答案。当我执行以下操作时:

today - (-2) * DAY

一切都正常。是意识形态问题,还是一个bug?


这是因为+可以根据上下文作为加法或字符串拼接操作符。(如果你有一个字符串值并尝试向它“添加”任何内容,第二个参数通常会被转换为字符串,而不是执行加法操作,从而进行字符串拼接。) - CBroe
请查看http://www.datejs.com/。 - cirrus
4个回答

3

今天 + 2 * 天使用字符串拼接。如果您想正确执行,请使用 today.getTime()。

示例:

tomorrow = new Date()
tomorrow.setTime(today.getTime() + DAY)

2
对于减号运算符-,使用日期对象的.valueOf方法。而对于加号运算符+,首先被视为字符串连接。 today - 2 * DAY 被视为 today.valueOf() - 2 * DAYtoday + 2 * DAY 被视为 today.toString() + 2 * DAY。因此,如果您想在日期对象上执行数学操作,请使用today.getTime()而不是只使用today

2
这有点难在规范中找到,因为它不在其他Date内容中。
如果您查看“加法运算符”第11.6.1节(链接),您会发现以下注释:
注意1:在步骤5和6的ToPrimitive调用中没有提供提示。除了Date对象之外的所有本机ECMAScript对象都将处理缺少提示的情况,就像给出Number提示一样;Date对象处理缺少提示的情况,就像给出String提示一样。主机对象可能以其他方式处理提示的缺失。
在这个上下文中,这意味着使用加法运算符(+)与Date对象将使用字符串值而不是数值。从这个意义上说,Date对象是特殊的,不同于任何其他类型的对象。
请注意,减法运算符没有这样的例外,因为它是明确的-它仅适用于数值减法;它不操作字符串。
还要注意,这适用于加法运算符,即具有两侧操作数的+。一元“加”运算符不起作用,因此左侧没有任何东西的+myDateObj将产生数值。

0

我认为像这样在JavaScript日期中添加和减去天数

var today= new Date();
var addDay=30;
today.setDate(today.getDate()+addDay);

现在,今天指向从今天开始的下一个30号日期


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接