【问题标题】:adding / subtracting time in JS在 JS 中加/减时间
【发布时间】:2013-04-30 09:00:57
【问题描述】:

最近我在玩 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?

【问题讨论】:

  • 这是因为+ 可以是加法或字符串连接运算符,具体取决于上下文。 (如果您有一个字符串值并尝试向其“添加”任何内容,则第二个参数通常会转换为字符串,并且会发生连接而不是添加。)
  • 看看datejs.com

标签: javascript date time


【解决方案1】:

今天 + 2 * DAY 使用字符串的连接。如果您想正确执行此操作,请使用 today.getTime()。

例子:

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

【讨论】:

    【解决方案2】:

    在规范中找到它有点棘手,因为它不包含在 Date 的其余部分中。

    如果您查看section 11.6.1,“加法运算符”,您会发现以下注释:

    注意 1 在第 5 步和第 6 步中对 ToPrimitive 的调用中未提供任何提示。除 Date 对象外,所有本机 ECMAScript 对象都处理没有提示的情况,就好像给出了提示 Number 一样;日期对象处理没有提示的情况,就好像给出了提示字符串一样。宿主对象可能会以其他方式处理提示的缺失。

    在上下文中,这意味着对 Date 对象使用加法运算符 (+) 将使用字符串值而不是数值。从这个意义上说,Date 对象是特殊的,不同于任何其他类型的对象。

    请注意,减法运算符没有这样的例外,因为它是明确的——它只适用于数字减法;它不对字符串进行操作。

    还请注意,这适用于加法运算符,即两边都有操作数的+。一元“加号”运算符不能这样工作,因此左侧没有任何内容的+myDateObj 将产生数值。

    【讨论】:

      【解决方案3】:

      对于-,即减号运算符,使用日期对象的.valueOf方法。

      而对于+,这首先被视为字符串连接。

      today - 2 * DAY 被视为today.valueOf() - 2 * DAY

      today + 2 * DAY 被视为today.toString() + 2 * DAY

      因此,如果您想对日期对象使用数学运算,请使用 today.getTime() 而不仅仅是 today

      【讨论】:

        【解决方案4】:

        我认为像这样在 javascript 日期中加减天数

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

        现在是指从今天开始的下一个第 30 天

        【讨论】:

          猜你喜欢
          • 2015-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多